2013-03-01 2 views
2

CDI 및 클래스 상속에 어려움을 겪고 있습니다. 나는 JAX-RS 컨트롤러로 선언 한 로 :이 컨트롤러는 기본 컨트롤러를 확장jax-rs 컨트롤러의 기본 클래스에서 CDI 주입이 수행되지 않았습니다.

@Path("/share") 
public class ControllerShare extends BaseController { 
    @Inject 
    private ServiceShare serviceShare; 

    @PostConstruct 
    private void verifInit() throws ExceptionTechnique { 
     log.warn("Checking CDI injection"); 
     if (serviceShare == null) { 
      log.error("serviceAccount not initialized. Check your EJB configuration"); 
      throw new ExceptionTechnique("serviceShare not initialized. Check your EJB configuration."); 
     } 
    } 
... 
} 

선언 :

public abstract class BaseController { 
    private Logger log = LoggerFactory.getLogger(ControllerShare.class); 

    @Context protected HttpServletRequest request; 
    @Inject private ControlerSession ctrlSession; 

    public BaseController() {} 

    @PostConstruct 
    private void verifInit() throws ExceptionTechnique { 
     log.warn("Checking CDI injection"); 
     if (ctrlSession == null) { 
      log.error("controllerSession not initialized. Check your CDI configuration"); 
      throw new ExceptionTechnique("serviceAccount not initialized. Check your CDI configuration."); 
     } 
    } 
... 
} 

문제는 분사가 제대로 ControllerShare에서 수행된다는 점이다 (I 제대로 "을 참조하십시오 Checking CDI injection "), BaseController 클래스에서는 수행되지 않습니다 (ctrlSession이 null 임). @Named 및 기타 조합을 성공없이 시도합니다. 주입은 ControllerShare에서 수행되며 BaseController에서는 수행되지 않습니다.

편집 : 한 가지 더 : 호기심 @Context 잘 노력하고 있습니다. 내 요청이 설정되어 있고 값이 정확합니다.

감사합니다. 설명 및 솔루션을 제공해 주셔서 감사합니다.

+0

매우 혼란 스럽지만 두 가지 객체가있는 것처럼 말하면서 두 가지 @PostContruct 메서드가 표시되는지 여부를 알 수 없습니다. AIUI 여기서 질문 할 수있는 유일한 질문은 다음과 같습니다. 인스턴스의 ctrlSession 필드가 null 또는 null이 아닌가요? – covener

답변

1

사실이

http://docs.jboss.org/cdi/spec/1.0/html/inheritance.html

4.2에 따라 작동한다. 부재 레벨 메타

의 상속 X는 Y가 X 상속 후 주입 필드 (X)를 선언하면, 클래스 X가 관리 빈 또는 세션 빈 Y.

  • 의 빈 클래스에 의해 직접적으로 또는 간접적으로 연장하자. 보조 노트에

: 당신이 새롭게을 지정하면 @PostConstruct 그러나 상속되지 않습니다. 따라서 하위 클래스에서 메소드의 이름을 달리 지정해야 초기화 프로그램을 모두 실행할 수 있습니다. X는 초기화를 선언하면

  • 비 정적 관찰자 @PostConstruct 또는 @PreDestroy 방법 X()는 다음 Y)는 X를 (상속되는 경우에만,도 Y 나 X의 서브 중간 클래스 Y의 슈퍼 클래스는 x() 메소드를 오버라이드 (override)합니다.
+0

BaseController에서 시도하고 아무 것도 수행하지 않습니다. ControllerShare에서 나는 다음 메시지를 얻었습니다. Bean을 다른 Bean으로 확장해야합니다 : 한정자를 사용하여 Managed Bean [@Any @Default] – jmcollin92

+0

Managed Bean [ControlersSession]에 대한 유효한 생성자가 있습니까? ? – omilke

+0

ControlerSession은 Bean으로 잘 인식되어 Producer가 필요하지 않습니다. @ 인젝션은이 콩에 대해 다른 곳에서도 잘 작동합니다 – jmcollin92

관련 문제