Мне очень нравится внедрение конструктора в CDI, но теперь я нашел случай, когда внедрение конструктора, очевидно, не работает должным образом.
В моем примере у меня есть два класса. Класс "BeanA" не имеет явной определенной области и не реализует Serializable. Класс "BeanB" аннотирован @SessionScoped и реализует Сериализуемый.
public class BeanA{
}
@SessionScoped
public class BeanB implements Serializable{
@Inject
private BeanA beanA;
}
Когда я пытаюсь внедрить экземпляр BeanA в BeanB, я получаю исключение UnserializableDependencyException от Weld, потому что 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. Я думал, что инжекция конструктора и инжекция поля более или менее эквивалентны, но, очевидно, это не так. В чем моя ошибка?