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를 얻을이 코드와 함께. 저는 생성자 주입과 필드 주입이 다소 비슷하다고 생각했지만 분명히 그렇지 않습니다. 내 실수는 무엇입니까?
답변 해 주셔서 감사합니다. 필자는 weld-servlet의 "1.0.1-Final"버전과 "1.1.5.Final"버전으로 테스트했습니다. BeanA를 직렬화 가능하게 만들 때 잘 동작합니다. 내 자신의 클래스의 경우 이것은 해결책이 될 수 있지만 다른 프레임 워크의 클래스를 주입 할 때 문제가 여전히 존재합니다. –
CDI 사양을 조사해 보았고 동작을 설명하는 단락을 발견했습니다. [link] (http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#passivatingscope), 6.6.4에 "패시베이션 가능 범위를 선언하는 관리 Bean : [...]이 비 일시적인 주입 필드, 패시베이션 가능 종속성 [...]으로 해석되지 않는 Bean 생성자 매개 변수 또는 초기화 메소드 매개 변수를 갖는 경우 컨테이너가 자동으로 감지합니다 문제를 배포 문제로 간주합니다. " 분명히 이것은 예상 된 동작이지만이 차별화의 이유가 무엇인지 완전히 이해하지 못했습니다 –
나는 그것을 보았고 예외가 있어야했습니다. Weld를위한 JIRA를 모으십시오. – LightGuard