Внедрение в конструктор CDI не работает с временными несериализуемыми зависимостями - PullRequest
4 голосов
/ 13 января 2012

Мне очень нравится внедрение конструктора в 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. Я думал, что инжекция конструктора и инжекция поля более или менее эквивалентны, но, очевидно, это не так. В чем моя ошибка?

1 Ответ

1 голос
/ 17 января 2012

Это похоже на ошибку.Все ли хорошо работает, если вы делаете BeanA сериализуемым?Также какую версию Weld вы используете?

...