Guice Persist с несколькими персистентными юнитами
У меня есть настройка с несколькими единицами персистентности, но проблема в том, что я предпочел бы иметь значение по умолчанию вместо того, чтобы явно объявлять одно или другое. Когда я захочу "другой", я буду прямо просить об этом. Когда мне нужен вариант по умолчанию, я хочу сделать то же самое, как если бы у меня был только один PU.
Я попытался просто установить JpaPersistModule внутри PrivateModule, но это ничего не изменило. Если я связываюсь с аннотацией "по умолчанию" и пытаюсь выполнить повторное связывание без классификатора "annotatedWith", я получаю ошибку повторного связывания.
Это возможно? Я полагаю, что с помощью эквивалента в CDI я могу ввести точку впрыска, чтобы посмотреть на нее и сделать это определение на месте. Я еще не нашел эквивалент в обличье, но должен быть.
С точки зрения кода, это то, что я имею (но не хочу):
@Inject
public SomethingService(@Primary Repository repository)
@Inject
public SomethingElseService(@Secondary Repository repository)
Вместо этого я хочу это:
@Inject
public SomethingService(Repository repository)
@Inject
public SomethingElseService(@Secondary Repository repository)
1 ответ
Это очень похоже на то, что я пытался сделать с аннотациями @Named вместо аннотаций @Primary / @Secondary в разделе Как связать динамическое связывание @Named
Я получил это, чтобы работать с Provider
с и PrivateModule
s; что-то вроде непроверенного следующего кода будет (я думаю) отражать настройки, которые я получил, чтобы работать, хотя потенциально все это может не понадобиться в вашем случае (и, возможно, ответ Джеффа на мой вопрос предоставит некоторый дополнительный контекст):
public class PrimaryRepositoryModule extends AbstractModule {
@Provides
public Repository provideRepository() {
return new PrimaryRepository()
}
}
public class SecondaryRepositoryModule extends AbstractModule {
public void configure() {
install(new PrivateSecondaryRepositoryModule())
}
private static class SecondaryProvider implements Provider<Repository> {
public Repository get() {
return new SecondaryRepository()
}
}
private static class PrivateSecondaryModule extends PrivateModule {
public void configure() {
bind(Repository.class).annotatedWith(Secondary.class)
.toProvider(SecondaryProvider.class)
expose(Repository.class).annotatedWith(Secondary.class)
}
}