2014-02-11 11 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