createInjector上的奇怪错误“无法拦截方法”

时间:2014-02-11 10:52:30

标签: guice guice-persist

我对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的东西出了问题,但如何解决? 的修改

3 个答案:

答案 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();