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с и PrivateModules; что-то вроде непроверенного следующего кода будет (я думаю) отражать настройки, которые я получил, чтобы работать, хотя потенциально все это может не понадобиться в вашем случае (и, возможно, ответ Джеффа на мой вопрос предоставит некоторый дополнительный контекст):

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)
    }
}
Другие вопросы по тегам