首页 > 解决方案 > 在 OpenLiberty 中使用带有 CDI 的构造函数注入

问题描述

我正在构建一个应该在 OpenLiberty 上运行的小型 Java EE 8 应用程序。它有一个ContainerResponseFilter如下所示的 JAX-RS:

package my.package;

import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class MyFilter implements ContainerResponseFilter {
    private final MyService myService;

    @Inject
    public DiagnosticsFilter(final MyService myService) {
        this.myService = myService;
    }

    @Override
    public void filter(final ContainerRequestContext request, final ContainerResponseContext response) {
        // Never mind this
    }
}

如果我这样编写过滤器并启动我的应用程序,myService构造函数的参数是null. 但是,如果字段被注释@Inject并且构造函数被省略,则该字段被正确注入。

该类MyService带有注释@Stateless,并且在beans.xml我设置了bean-discovery-mode="all".

知道我做错了什么吗?这真的应该工作吗?Weld 文档建议它应该这样做,但我不确定它是否也在 CDI 规范中......

标签: jax-rscdiopen-liberty

解决方案


这是一个很长的故事......有些人正在努力解决这个问题:JAX-RS 注入!= CDI 注入
它应该在 JAX-RS 2.2 中解决,应该使用 CDI 注入代替 JAX-RS 注入和 JAX -RS v3.0 将完全删除 JAX-RS 注入
阅读此主题:
https ://www.eclipse.org/community/eclipse_newsletter/2019/february/Jakarta_EE_9.php
https://github.com/eclipse- ee4j/jaxrs-api/issues/569
https://github.com/eclipse-ee4j/jaxrs-api/issues/639
https://groups.google.com/forum/#!topic/microprofile/gvj94XBhtvM


推荐阅读