0

我对 guice 有一些经验,我只是尝试了 guice-persist。但是现在我在非常简单的模块中遇到了一个非常奇怪的错误。这是我的模块:

public class VotingModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(VotingService.class).to(VotingServiceImpl.class);
    }

}

我创建了一个工厂(这是为了使用这个 api,没有 main)来获取服务的实例:

    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的东西出了点问题,但是如何解决呢? 编辑

4

3 回答 3

1

好的,经过几个小时的调试,我发现了问题:问题是接口实现中的私有构造函数。对于vanilla guice,私有构造函数很好(恕我直言,你不能使用“new”)。但是 AOP(拦截器)不适用于私有构造函数。

我认为文档中应该对此有一些提示?!

于 2014-02-11T13:33:57.490 回答
1

将 Guice 从 4.0 升级到 4.2.1 为我解决了相同的报告错误。请注意,它仅在从 JDK 1.8 升级到 1.10 时首先表现出来。

于 2018-09-26T11:01:21.537 回答
0

在我的情况下,这个错误是由使用构造函数初始化的静态成员引起的。

private static final CacheControl CACHE_CONTROL = new CacheControl();

将其更改为非静态成员。

private final CacheControl cacheControl = new CacheControl();
于 2018-05-09T11:52:48.623 回答