2014-02-11 3 views
0

나는 guice에 대한 경험이 있으며 방금 guice-persist를 시도했습니다. 하지만 지금은 아주 간단한 모듈에서 아주 이상한 오류가 발생합니다. 이 내 모듈입니다 :createInjector에 이상한 오류가 발생했습니다 "도청 할 수 없습니다"

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 및 구현 : 나는 서비스의 인스턴스를 얻을 수있는 공장을 (이이 API를 사용하기위한, 더 메인이되지 않습니다) 생성

public class VotingModule extends AbstractModule { 

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

} 

간단한 데이터베이스 상호 작용을 캡슐화합니다. 이를 위해 "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의 개인 생성자는 괜찮습니다 (imho good practice - "new"를 사용할 수 없음). 그러나 AOP (인터셉터)는 개인 생성자에서는 작동하지 않습니다.

문서에 대한 몇 가지 힌트가 있어야한다고 생각합니다.

+0

개인 생성자를 사용할 때 – jwells131313

+0

당신이 맞아요, 이것이 문서에 언급되어 있지 않은 것 같습니다. Guice는 클래스의 하위 클래스를 생성하므로 수퍼 클래스 생성자를 호출 할 수 있어야합니다. 생성자가 패키지 전용 인 경우 단위 테스트가 가능하다는 이점이 있습니다. –

+0

단위 테스트에서 guice (jukito)를 사용하고 있습니다. 그래서 나는 거기에 생성자를 필요로하지 않는다. 그러나 개인을 포장하는 힌트를위한 thx. – dermoritz