java - CDI 构造函数注入(inject)不适用于 transient 不可序列化依赖项

标签 java cdi serializable transient constructor-injection

我非常喜欢 CDI 的构造函数注入(inject),但现在我发现了一个用例,其中构造函数注入(inject)显然没有按预期工作。

在我的示例中,我有两个类。 “BeanA”类没有明确定义范围,也没有实现 Serializable。类“BeanB”用@SessionScoped 注释并且确实实现了Serializable。

public class BeanA{
}

@SessionScoped
public class BeanB implements Serializable{
    @Inject
    private BeanA beanA;
}

当我尝试将 BeanA 的实例注入(inject)到 BeanB 中时,我从 Weld 得到了一个 UnserializableDependencyException,因为 BeanA 不可序列化。这是预期的行为。

当我用“transient”标记字段“beanA”时,注入(inject)工作没有问题:

@Inject
private transient BeanA beanA;

现在 Weld 不会抛出任何异常。

这对我来说完全没问题,但当我想使用构造函数注入(inject)时,我的理解就会出现问题。当我执行以下操作时,它不再起作用:

@SessionScoped
public class BeanB implements Serializable{
    private transient BeanA beanA;

    @Inject
    public BeanB(BeanA beanA){
        this.beanA = beanA;
    }

    public BeanB(){}
}

通过这段代码,我再次得到 UnserializableDependencyException。我认为构造函数注入(inject)和字段注入(inject)或多或少是等价的,但显然它们不是。我的错误是什么?

最佳答案

这似乎是一个错误。如果使 BeanA 可序列化,是否一切正常?另外,您使用的是哪个版本的 Weld?

关于java - CDI 构造函数注入(inject)不适用于 transient 不可序列化依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843927/

相关文章:

java - 如何使此应用程序中的 Apache Log4J 日志记录有用?

jsf - 识别和解决javax.el.PropertyNotFoundException:目标不可达

java - 访问实例列表返回 NullPointerException

java - 如何将一个对象序列化为java中同一对象内的方法?

java - 主动 JDBC 按字母顺序保存数据

java - 用Java复制文件的最快方法

java - 如何在 jruby 中传递类类型参数

jakarta-ee - 在 @SessionScoped 中使用 ejb 计时器

java - Java 中可序列化类的不可序列化异常

java - 我可以在 UI 线程之外使用 getFilesDir