我对guice有一些经验,我只是尝试了guice-persist。但现在我在一个非常简单的模块中得到了一个非常奇怪的错误。 这是我的模块:
public class VotingModule extends AbstractModule {
@Override
protected void configure() {
bind(VotingService.class).to(VotingServiceImpl.class);
}
}
我创建了一个工厂(这是用于使用此api,没有主要工具)来获取服务的实例:
public static VotingService getService(final String persistenceUnit) {
// initialization of dependency injection
Injector i = Guice.createInjector(new JpaPersistModule(persistenceUnit), new VotingModule());
// Starts persistence stuff (jpa is ready now)
i.getInstance(PersistService.class).start();
return i.getInstance(VotingService.class);
}
VotingService及其实现封装了简单的数据库交互。对于这个“VotingServiceImpl”,只注入一个EntityManager并在某些方法上使用@Transactionl。 那我为什么要
1) Unable to method intercept: com.prodyna.nabucco.groupware.voting.core.service.impl.VotingServiceImpl
at com.prodyna.nabucco.groupware.voting.core.service.impl.VotingModule.configure(VotingModule.java:10)
? 这个简单的测试会引发错误:
@Test
public void test(){
VotingService vs = VotingServiceFactory.getService();
}
修改 仅当绑定实现使用@Transactional时才会出现此错误。所以aop的东西出了问题,但如何解决? 的修改
答案 0 :(得分:1)
好的,我在调试几个小时后发现了问题:问题是接口'实现中的私有构造函数。 对于香草guice私人建设者是好的(imho良好的做法 - 你不能使用“新”)。但AOP(拦截器)不适用于私有构造函数。
我认为医生应该有一些提示吗?!
答案 1 :(得分:1)
将Guice从4.0升级到4.2.1为我解决了相同的报告错误。请注意,它仅在从JDK 1.8升级到1.10时首先表现出来。
答案 2 :(得分:0)
在我的情况下,这个错误是由使用构造函数初始化的静态成员引起的。
private static final CacheControl CACHE_CONTROL = new CacheControl();
将其更改为非静态成员。
private final CacheControl cacheControl = new CacheControl();