2017-11-08 7 views
-1

Guice 주입에 대한 내 게시물에서 매우 좋은 답변을 얻은 후에 Guice에 EntityManagers를 주입하는 데 도움을 줄 수 있는지 알고 싶습니다.guice로 EntityManager를 삽입

이미 Guice JPA에 관한 문서 https://github.com/google/guice/wiki/JPA을 읽었습니다. 내 코드 (나는 내 ​​작품에 대한 제공이 필요) 다음과 같다 :

공급자 : DatabaseControllerImplementation의

public class DatabaseControllerProvider implements Provider<DatabaseControllerInterface> { 


    private final Provider<EntityManager> entityManagerProvider; 

    @Inject 
    public DatabaseControllerProvider(final Provider<EntityManager> manager) { 
     this.entityManagerProvider = manager; 
    } 

    @Override 
    public DatabaseControllerInterface get() { 
     return new DatabaseControllerImpl(entityManagerProvider.get()); 
    } 
} 

생성자 :

public LogInFront() { 
     final Injector injector = Guice.createInjector(new ModuleBinder(), new JpaPersistModule("ATVPersistence")); 
     final PersistService persistService = persistenceInjector.getInstance(PersistService.class); 
     persistService.start(); 
     logInService = injector.getInstance(LogInServiceInterface.class); 
} 
:이 전화

public class DatabaseControllerImpl implements DatabaseControllerInterface { 

    private final EntityManager em; 

    @Inject 
    public DatabaseControllerImpl(final EntityManager manager) { 
     this.em = manager; 
    } 
} 

최고 수준

내 데이터베이스로 JPAPersistService를 인스턴스화합니다.

나는 오류, 그 no Implementation for EntityManager was bound을받을 수 있지만 내가

... 
public LogInFront() { 
     final Injector injector = Guice.createInjector(new JpaPersistModule("ATVPersistence")); 
     final PersistService persistService = persistenceInjector.getInstance(PersistService.class); 
     persistService.start(); 
     logInService = injector.getInstance(LogInServiceInterface.class); 
} 

를 호출하면 인스턴스는 데이터베이스가 잘 작동하고, 모든 좋은 쉽고, 제대로 작동합니다.

내 GuessModule에 문제가있는 것 같습니다. 위에서 볼 수 있듯이 new ModuleBinder()을 호출하지 않으면 모든 것이 올바르게 작동합니다.

public class ModuleBinder extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(DatabaseControllerInterface.class).asEagerSingleton(); 
     bind(AnalyzerInterface.class).asEagerSingleton(); 
     bind(SystemAdministrationInterface.class).asEagerSingleton(); 
     bind(LogInServiceInterface.class).asEagerSingleton(); 
    } 
} 

----------------------------- 편집 ------------- ------------------------

위 섹션을 씁니다.

Tl; dr edition : ModuleBinder가 EntityManager 주입을 왜곡합니까?

--------------------------- 오류 발견 ----------------- --------------

나는 멍청한 느낌, 나는 오류를 발견. ModuleBinder을 살펴보면 모든 것을 EagerSingleton으로 바인딩하지만 분명히 EntityManager은 존재하지 않습니다 (Injector를 만든 후에 PersistService가 시작됨). 나는 이것에 새로운 포스트를 여기에서 창조했다 : JPAPersistenceModule Guice Injector

다른 사람들을 돕는 5 월! 나는 종류의 바보 같은 느낌이

안부,

JosefRucksack

+0

코드에 일부 문제가있는 것은 아닙니다. Guice는 클래스 패스에 JPA를 구현하지 않았다고 말합니다. JPA 자체는 API 일 뿐이며 아무 것도하지 않습니다. API의 실제 구현 로직을 제공하려면 Hibernate, EclipseLink 또는 OpenJPA가 필요하다. – Gimby

+0

나는 그것을 알고있다. EntityManagerFactory를 수동으로 생성하여 TomEE 외부에서 코드를 실행하면 잘 작동합니다. 서버를 실행하고 EntityManager에 액세스하려고 할 때 문제가 발생합니다. 또한, 엔티티 관리자를 삽입하려고하지 않을 때, '최종 PersistService persistService = persistenceInjector.getInstance (PersistService.class);'는 Persistence 유닛과 모든 것을 찾습니다. pom.xml에서 결함이 있는지 확인하고 싶습니까? – JosefRucksack

답변

0

, 나는 오류를 발견했습니다. ModuleBinder을 살펴보면 모든 것을 EagerSingleton으로 바인딩하지만 분명히 EntityManager은 존재하지 않습니다 (Injector를 만든 후에 PersistService가 시작됨).

final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder()); 

수정 모든 호출

. 부모가 알고있는 것을 모두 알고있는 childInjector를 생성합니다. 따라서 PersistenceService가 이미 시작되었고 EntityManager을 모든 것에 주입 할 수 있습니다.