Guice Persist с несколькими персистентными юнитами - PullRequest
0 голосов
/ 30 января 2019

У меня есть настройка с несколькими единицами персистентности, но у меня проблема в том, что я предпочел бы иметь значение по умолчанию вместо того, чтобы явно объявлять одно или другое.Когда я захочу «другой», я буду прямо просить об этом.Когда мне нужен вариант по умолчанию, я хочу сделать то же самое, как если бы у меня был только один 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 Ответ

0 голосов
/ 01 февраля 2019

Это очень похоже на то, что я пытался сделать с аннотациями @Named вместо @Primary / @Secondary аннотаций в Как связать динамическое связывание @Named

Iзаставил его работать с Provider s и 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)
    }
}
...