11

JodaTimeで動作するようにlambdajを構成する際に問題があります。は最終クラスであるためLocalDate、Lambdajは次のように初期化する必要があります:(バグ70を参照

public class LocalDateArgumentCreator implements FinalClassArgumentCreator<LocalDate> {
    private final long MSECS_IN_DAY = 1000L * 60L * 60L * 24L;
    public LocalDate createArgumentPlaceHolder(int seed) {
        return new LocalDate((long)seed * MSECS_IN_DAY);
    }
}
ArgumentsFactory.registerFinalClassArgumentCreator(LocalDate.class, new LocalDateArgumentCreator());

この構成を事実上すべての場所に適用する必要があるため、これを実装する方法に関するオプションが不足しています。私たちのアプリケーションは、SpringとWicketをベースにしたWebアプリケーションです。

私は3つの異なるオプションを考え出しました:

1.コアMavenモジュールの静的初期化ブロック

コアモジュールは他のすべてのモジュールに含まれているため、すべてのモジュールにクラスが含まれます。残りの質問は、ターゲットクラスへの参照がない場合でも、静的ブロックは常に初期化されるのでしょうか。

public final class LambdajInitializer {
    static {
        // initialize like above
    }
}

2.初期化中のBeanapplicationContext.xml

欠点:Spring以外のテストでは初期化されません

例:applicationContext-core.xml(すべてのモジュールに含まれています)

<bean class="...LambdajInitializer" />

public class LambdajInitializer {
    @PostConstruct
    public void init() {
        // Lambdaj initialization
    }
}

3.Wicketアプリケーションクラスの初期化メソッドの呼び出し

欠点:Webモジュールの外部で初期化されることはありません

public class MyApplication extends WebApplication {
    @Override
    public void init() {
        ...
        // Lambdaj initialization
        ...
    }
}

私の質問は:これを達成するための好ましい方法はどれですか?

4

2 に答える 2

2
  1. staticこの種の初期化を必要としない将来のモジュール(呼び出しの可能性は低い)がある可能性があるため、初期化は避けます。私は初期化を好きではありませんstatic
  2. これは合理的なアプローチです。この初期化は@Before、非スプリングユニットテストのセクションに配置できます。
  3. 2.の場合と同様に、セクションのコードを初期化できます@Before

オプション4.テスト専用のSpring構成クラス/ファイルを作成し、それを使用してテストに渡すことができます。@ContextConfiguration

于 2012-12-18T07:34:25.587 に答える
0

次の結論に達しました。

  1. FinalClassArgumentCreatorアプリケーションの実行時に、WicketApplicationクラスのinit()メソッドでLambdajを初期化します。このようにして、Lambdajを使用する前にほぼ確実に初期化されます。
  2. WicketコンポーネントとページをテストするためにTestApplication、本番アプリケーションと同じ初期化コードを使用する独自のクラスを作成しました。
  3. スタンドアロンのバッチジョブについては、Lambdajを使用しないことにしました。後でそれを使用することにした場合は、Springがインスタンス化するクラスへの初期化を抽出する可能性があります。
于 2012-12-27T06:57:57.043 に答える