使用构造函数注入钝化 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?

是的,继续吧。