2014-02-11 12 views
0

我有一些与guice有关的经验,我只是尝试了guice-persist。但是现在我在非常简单的模块中遇到了一个非常奇怪的错误。 这是我的模块:createInjector上的奇怪错误“无法截取方法”

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) 

? 错误是扔在这个简单的测试:如果绑定实现使用@Transactional只发生

@Test 
    public void test(){ 
     VotingService vs = VotingServiceFactory.getService(); 
    } 

编辑 此错误。所以,一些东西出了问题,但如何解决它? 编辑

回答

1

好吧我在调试几个小时后发现问题:问题是接口'实现中的私有构造函数。 对于香草guice私人构造函数是好的(恕我直言良好的做法 - 你不能使用“新”)。但AOP(拦截器)不适用于私有构造函数。

我认为应该在doc中提供一些提示吗?!

+0

+1上使用私人构造函数 – jwells131313

+0

你说得对,这似乎没有在文档中提到。尽管如此,Guice会生成一个类的子类,所以它必须能够调用超类的构造函数。如果构造函数是包私有的,并且具有单元可测试的优点,那么不会有任何问题。 –

+0

我在单元测试中使用guice(jukito)。所以我不需要那里的构造函数。但thx暗示打包私人。 – dermoritz