Обширная конфигурация 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