Java – CDI constructor injection is not applicable to transient non serializable dependencies
I like CDI's constructor injection, but now I've found a use case where constructor injection obviously doesn't work as expected
In my example, I have two classes Class "beana" has no well-defined scope and does not implement serializable Class "beanb" annotates with @ sessionscope and implements serializable
public class BeanA{
}
@SessionScoped
public class BeanB implements Serializable{
@Inject
private BeanA beanA;
}
When I try to inject an instance of beana into beanb of a bean, I get an serializabledependencyexception from weld because beana is not serializable This is expected behavior
When I mark the "beana" field with "transient", there is no problem with the injection:
@Inject private transient BeanA beanA;
Now weld will not throw any exceptions
This is very good for me, but when I like to use constructor injection, my understanding problems arise It no longer works when I do the following:
@SessionScoped
public class BeanB implements Serializable{
private transient BeanA beanA;
@Inject
public BeanB(BeanA beanA){
this.beanA = beanA;
}
public BeanB(){}
}
Using this code, I get unserializabledependencyexception again I think constructor injection and field injection are more or less equal, but obviously they are not What's my fault?
Solution
This seems to be a mistake If you make beana serializable, does everything work well? Which version of weld do you still use?
