我有以下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使用构造函数注入的信息。
答案 0 :(得分:0)
您获得的错误基于CDI specification requirements,即需要使用no-args构造函数。在实例化对象时,CDI当然会优先考虑用@Inject
注释的构造函数,所以不要担心。
你需要no-args的真正原因是代理。 Weld / CDI将尝试创建对象的一个或多个代理,这些代理基本上是一个丰富的代理。为了实例化它们,你想要调用no-arg构造函数 - 把它想象成Java限制,你不应该在不调用构造函数的情况下实例化对象。因此规范要求使用no-arg构造函数。事实上,在某些情况下,Weld本身允许您bypass this need ,但我强烈反对。
添加一个包可见的no-args构造函数是否安全?
是的,继续这样做。