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

时间:2017-08-25 07:37:29

标签: java dependency-injection cdi weld

我有以下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);
    }
}

如果我启动webapplication(带有Weld的Tomcat),则抛出以下异常:

  

WELD-001435:正常范围的bean类   com.myorg.ReportService不可代理,因为它   没有no-args构造函数 - Managed Bean [类   com.myorg.ReportService]带限定符[@Any   @default]。

如何在SessionScoped Bean中使用构造函数注入? 添加一个包可见的no-args构造函数是否安全?

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

1 个答案:

答案 0 :(得分:0)

您获得的错误基于CDI specification requirements,即需要使用no-args构造函数。在实例化对象时,CDI当然会优先考虑用@Inject注释的构造函数,所以不要担心。

你需要no-args的真正原因是代理。 Weld / CDI将尝试创建对象的一个​​或多个代理,这些代理基本上是一个丰富的代理。为了实例化它们,你想要调用no-arg构造函数 - 把它想象成Java限制,你不应该在不调用构造函数的情况下实例化对象。因此规范要求使用no-arg构造函数。事实上,在某些情况下,Weld本身允许您bypass this need ,但我强烈反对。

  

添加一个包可见的no-args构造函数是否安全?

是的,继续这样做。