首页 > 解决方案 > Guice Persist 具有多个持久性单元

问题描述

我已经设置了多个持久性单元的 guice,但我遇到的问题是我更喜欢有一个默认值,而不是必须显式声明一个或另一个。当我想要“另一个”时,我会明确要求它。当我想要默认的时,我会想做同样的事情,就好像我只有一个 PU。

我尝试仅在 PrivateModule 中安装 JpaPersistModule,但这并没有改变任何东西。如果我绑定到“默认”注释并尝试在没有“annotatedWith”分类器的情况下重新绑定,我会收到重新绑定错误。

这可能吗?我相信使用 CDI 中的等价物,我可以注入注入点来查看它并当场做出决定。我还没有在 guice 中找到等价物,但一定有。

就代码而言,这就是我所拥有的(但不想要):

@Inject
public SomethingService(@Primary Repository repository)

@Inject
public SomethingElseService(@Secondary Repository repository)

相反,我想要这个:

@Inject
public SomethingService(Repository repository)

@Inject
public SomethingElseService(@Secondary Repository repository)

标签: guice-persist

解决方案


这与我在如何绑定动态@Named 绑定中尝试使用@Named 注释而不是@Primary / @Secondary 注释非常相似

我已经让它与Providers 和PrivateModules 一起工作;未经测试的以下代码的某些内容(我认为)会反映我已经开始工作的设置,尽管在您的情况下可能不需要所有这些(并且可能 Jeff 对我的问题的回答会提供更多上下文) :

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)
    }
}

推荐阅读