繁体   English   中英

使用构造函数注入对CDI SessionBean进行钝化

[英]Passivation of CDI SessionBean with Constructor Injection

我有以下CDI Bean:

@SessionScoped
public class ReportService implements Serializable {
    private static final long serialVersionUID = 1L;

    private MyDao myDao;

    @Inject
    public ReportService(MyDao myDao) {
        this.myDao = myDao;
    }
}

@RequestScoped
public class MyDao extends AbstractDao<Order> {

    protected MyDao() {

    }

    @Inject
    public MyDao(EntityManager em) {
        super(em);
    }
}

如果我启动Web应用程序(带有Weld的Tomcat),则会引发以下异常:

WELD-001435:普通范围内的Bean类com.myorg.ReportService无法代理,因为它没有no-args构造函数-带有限定符[@Any @Default]的托管Bean [类com.myorg.ReportService]。

如何在SessionScoped Bean中使用构造函数注入? 仅添加包可见的无参数构造函数是否安全?

我已经进行了很多搜索,但没有找到有关使用构造函数注入钝化CDI Bean的任何信息。

您收到的错误基于CDI规范要求 ,即需要无参数构造函数。 实例化对象时,CDI当然会优先使用@Inject注释的构造函数,因此不必担心。

不需要参数的真正原因是代理 Weld / CDI将尝试为您的对象创建一个或多个代理,这些代理基本上是一个丰富的委托。 为了实例化它们,您想调用no-arg构造函数-将其视为Java limiation,您不应该在不调用构造函数的情况下实例化对象。 因此,规范要求需要无参数构造函数。 事实上, 在某些情况下 ,Weld本身可以让您绕过此需求 ,但我强烈建议您不要这样做。

仅添加包可见的无参数构造函数是否安全?

是的,继续这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM