2014-01-15 1 views
1

JPA로 큰 응용 프로그램을 CDI로 마이그레이션하려고합니다. 모든 코드를 변경하기 전에 다음 패턴이 작동하는지 알아야합니다. 이렇게하면 응용 프로그램을 부분적으로 마이그레이션 할 수 있습니다. 명명 된 상태 비 저장 빈을 인스턴스화 할 수 있습니까?

내 관리 빈

:

@Named 
@Stateless 
public class LanguageBoundary implements Serializable { 

    @Inject 
    LanguageService languageService; 

    @Inject 
    CrudService crudService; 

    public LanguageEntity findById(Long id) { 
     return crudService.find(LanguageEntity.class, id); 
    } 

...

내가 다른 클래스에서 사용할 수는 다음에 대한 조언

// Methods: DAO - Used by original deprecated parent wrapper class 
public LanguageEntity findByIdImpl(Id id) { 

    LanguageBoundary lb = new LanguageBoundary(); 
    return lb.findById(id.getValue()); 
} 

감사합니다.

답변

2

이 일을하려면, 당신은 개체에 대한 참조를 얻을 필요가. CDI를 사용하여이 작업을 수행 할 수 있습니다. CDI 1.1에서는 CDI 유틸리티 클래스를 얻을 수 있습니다. CDI 1.0에서는 JNDI를 사용하여 bean manager에 대한 참조를 얻을 수 있습니다. 참조 용으로이 코드를 살펴보십시오. https://github.com/apache/deltaspike/blob/master/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java#L98

나는 왜 @Named을 사용하고 있는지 궁금합니다. UI에서 직접 EJB를 참조 할 계획입니까?

+0

나는 존 (John)만큼 호기심이 많습니다. '@Named'는 EL을 통해 웹 페이지에 표시되는 CDI 빈을 선언합니다. 여기서 '@Stateless'는 EJB 컨테이너 빈을 선언합니다. 우려의 분리가 둘 모두를 혼합하는 것은 아닙니다. 또한 EJB 구성 요소를 UI 계층에 표시하는 것은 좋지 않습니다. – Sam

4

인스턴스화하면 bean이 컨테이너에서 관리하지 않으므로 원하는 내용이 아닐 수 있습니다. 대신, 당신은 그것을 삽입해야 @Inject

관련 문제