使用构造函数注入钝化 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);
}
}
如果我启动我的网络应用程序(Tomcat with Weld),则会抛出以下异常:
WELD-001435: Normal scoped bean class
com.myorg.ReportService is not proxyable because it
has no no-args constructor - Managed Bean [class
com.myorg.ReportService] with qualifiers [@Any
@Default].
如何在 SessionScoped Bean 中使用构造函数注入?
仅添加包可见的无参数构造函数是否安全?
我已经搜索了很多,但我没有找到任何关于使用构造函数注入钝化 CDI Bean 的信息。
您得到的错误是基于 CDI specification requirements,即需要有无参数构造函数。在实例化对象时,CDI当然会优先使用@Inject
注解的构造函数,不用担心
你需要无参数的真正原因是代理。 Weld/CDI 将尝试为您的对象创建一个或多个代理,这些代理基本上是一个丰富的委托。为了实例化它们,您需要调用无参数构造函数 - 将其视为 Java 限制,您不应该在不调用构造函数的情况下实例化对象。因此,规范要求需要无参数构造函数。事实上,Weld 本身允许您在某些情况下bypass this need ,但我强烈建议您不要这样做。
Is it safe just to add a package-visible no-args constructor?
是的,继续吧。
我有以下 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);
}
}
如果我启动我的网络应用程序(Tomcat with Weld),则会抛出以下异常:
WELD-001435: Normal scoped bean class com.myorg.ReportService is not proxyable because it has no no-args constructor - Managed Bean [class com.myorg.ReportService] with qualifiers [@Any @Default].
如何在 SessionScoped Bean 中使用构造函数注入? 仅添加包可见的无参数构造函数是否安全?
我已经搜索了很多,但我没有找到任何关于使用构造函数注入钝化 CDI Bean 的信息。
您得到的错误是基于 CDI specification requirements,即需要有无参数构造函数。在实例化对象时,CDI当然会优先使用@Inject
注解的构造函数,不用担心
你需要无参数的真正原因是代理。 Weld/CDI 将尝试为您的对象创建一个或多个代理,这些代理基本上是一个丰富的委托。为了实例化它们,您需要调用无参数构造函数 - 将其视为 Java 限制,您不应该在不调用构造函数的情况下实例化对象。因此,规范要求需要无参数构造函数。事实上,Weld 本身允许您在某些情况下bypass this need ,但我强烈建议您不要这样做。
Is it safe just to add a package-visible no-args constructor?
是的,继续吧。