我有带有多个持久性单元的设置向导,但是我遇到的问题是,我希望有一个默认值,而不是必须显式声明一个或另一个。当我想要“另一个”时,我会明确要求它。当我想要默认的设备时,我会想做的事情就像我只有一个PU。
我尝试仅在PrivateModule中安装JpaPersistModule,但这并没有改变任何东西。如果我绑定到“默认”注释并尝试在没有“ 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)
答案 0 :(得分:0)
这与我尝试使用@Named注释而不是How to bind a dynamic @Named binding
中的@Primary / @Secondary注释非常相似。我已经将它与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)
}
}