Обширная конфигурация Lambdaj FinalClassArgumentCreators. Где и как это сделать?

У нас есть проблема с настройкой lambdaj для работы с Joda Time. Поскольку 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.

Я придумал три разных варианта:

1. Статический блок инициализации в основном модуле maven

Поскольку основной модуль включен в каждый другой модуль, все модули будут включать класс. Остается вопрос, что статические блоки всегда инициализируются, даже если ссылки на целевой класс отсутствуют?

Пример

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

2. Инициализация bean в applicationContext.xml

Даунсайд: никогда не инициализируется для тестов Spring

Пример: В applicationContext-core.xml(входит в каждый модуль)

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

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

3. Вызов метода инициализации в классе приложения Wicket

Даунсайд: никогда не инициализируется вне веб-модуля

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

Мой вопрос: что является предпочтительным способом достижения этого?

Ответ 1

Мы пришли к следующему выводу:

  • В течение времени выполнения приложения мы инициализируем Lambdaj FinalClassArgumentCreator в методе Wicket Application init(). Таким образом, они почти наверняка инициализируются перед любым использованием Lambdaj.
  • Для тестирования компонентов Wicket и страниц мы создали собственный класс TestApplication, который использует тот же код инициализации, что и производственное приложение.
  • Для автономных пакетных заданий мы решили не использовать Lambdaj. Если позже мы примем решение использовать его, мы, вероятно, извлечем инициализацию в класс, который будет w760 > .

Ответ 2

  • Я бы избегал инициализации static, поскольку у вас могут быть (как маловероятны ваши вызовы) модули в будущем, которые не нуждаются в такой инициализации. Мне не нравятся static inits.
  • Это разумный подход, вы можете поместить эту инициализацию в раздел @Before нестандартных тестов spring
  • Как и для 2., вы можете инициализировать код в разделах @Before.

Вариант 4. вы можете создать тестовый класс Spring класс/файл конфигурации и передать его на свои тесты с помощью @ContextConfiguration