我非常喜欢CDI的构造函数注入,但现在我找到了一个用例,其中构造函数注入显然无法按预期工作。
在我的例子中,我有两节课。类“BeanA”没有定义明确的范围,也没有实现Serializable。类“BeanB”使用@SessionScoped进行注释,并实现Serializable。
public class BeanA{
}
@SessionScoped
public class BeanB implements Serializable{
@Inject
private BeanA beanA;
}
当我尝试将BeanA的实例注入到cource的BeanB中时,我从Weld获取UnserializableDependencyException,因为BeanA不可序列化。这是预期的行为。
当我用“瞬态”标记“beanA”字段时,注入工作没有问题:
@Inject
private transient BeanA beanA;
现在Weld不会抛出任何例外。
这对我来说非常好,但是当我喜欢使用构造函数注入时,我的理解问题就出现了。当我执行以下操作时,它不再起作用了:
@SessionScoped
public class BeanB implements Serializable{
private transient BeanA beanA;
@Inject
public BeanB(BeanA beanA){
this.beanA = beanA;
}
public BeanB(){}
}
使用此代码,我再次获得UnserializableDependencyException。我认为构造函数注入和场注入或多或少相等,但显然它们不是。我的错是什么?
答案 0 :(得分:1)
这似乎是一个错误。如果你使BeanA可序列化,一切都运行良好吗?您还使用哪个版本的Weld?