2012-01-12 2 views
4

CDI 생성자 주입을 많이 좋아하지만 현재 생성자 삽입이 예상대로 작동하지 않는 유스 케이스를 발견했습니다.CDI 생성자 삽입이 일시적 비 직렬화 가능 종속성과 함께 작동하지 않습니다.

예를 들어 나는 두 개의 클래스를 가지고 있습니다. 클래스 "BeanA"에는 명시적인 스코프가 정의되어 있지 않고 Serializable을 구현하지 않습니다. 클래스 "BeanB"는 @SessionScoped 주석이 달리고 Serializable을 구현합니다. 내가 cource의 BeanB에 BeanA의 인스턴스를 주입 할 때 BeanA가 직렬화되지 않기 때문에

public class BeanA{ 
} 

@SessionScoped 
public class BeanB implements Serializable{ 
    @Inject 
    private BeanA beanA; 
} 

나는 용접에서 UnserializableDependencyException를 얻을. 이것이 예상되는 동작입니다.

@Inject 
private transient BeanA beanA; 

이제 용접이 예외를 throw하지 않습니다 :

나는 문제없이 "과도"주입 작업과 함께 "beanA"필드에 표시

.

이것은 나를 위해 완벽하게 괜찮지 만 생성자 주입으로이 작업을하고 싶을 때 내 이해 문제가 발생합니다. 내가 다음 작업을 수행 할 때 그것은 더 이상 작동하지 않습니다

@SessionScoped 
public class BeanB implements Serializable{ 
    private transient BeanA beanA; 

    @Inject 
    public BeanB(BeanA beanA){ 
     this.beanA = beanA; 
    } 

    public BeanB(){} 
} 

을 내가 다시 UnserializableDependencyException를 얻을이 코드와 함께. 저는 생성자 주입과 필드 주입이 다소 비슷하다고 생각했지만 분명히 그렇지 않습니다. 내 실수는 무엇입니까?

답변

1

버그와 같이 보입니다. BeanA를 직렬화 가능하게 만들면 모든 것이 잘 작동합니까? 또한 어떤 버전의 Weld를 사용하고 있습니까?

+0

답변 해 주셔서 감사합니다. 필자는 weld-servlet의 "1.0.1-Final"버전과 "1.1.5.Final"버전으로 테스트했습니다. BeanA를 직렬화 가능하게 만들 때 잘 동작합니다. 내 자신의 클래스의 경우 이것은 해결책이 될 수 있지만 다른 프레임 워크의 클래스를 주입 할 때 문제가 여전히 존재합니다. –

+0

CDI 사양을 조사해 보았고 동작을 설명하는 단락을 발견했습니다. [link] (http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#passivatingscope), 6.6.4에 "패시베이션 가능 범위를 선언하는 관리 Bean : [...]이 비 일시적인 주입 필드, 패시베이션 가능 종속성 [...]으로 해석되지 않는 Bean 생성자 매개 변수 또는 초기화 메소드 매개 변수를 갖는 경우 컨테이너가 자동으로 감지합니다 문제를 배포 문제로 간주합니다. " 분명히 이것은 예상 된 동작이지만이 차별화의 이유가 무엇인지 완전히 이해하지 못했습니다 –

+0

나는 그것을 보았고 예외가 있어야했습니다. Weld를위한 JIRA를 모으십시오. – LightGuard