【发布时间】:2019-02-14 07:35:21
【问题描述】:
我正在构建一个应该在 OpenLiberty 上运行的小型 Java EE 8 应用程序。
它有一个 JAX-RS ContainerResponseFilter,如下所示:
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。
但是,如果 field 带有 @Inject 注释并且构造函数被省略,则该字段被正确注入。
MyService 类用@Stateless 注释,在beans.xml 中我设置了bean-discovery-mode="all"。
知道我做错了什么吗?这真的应该工作吗? Weld documentation 建议它应该这样做,但我不确定它是否也在 CDI 规范中......
【问题讨论】:
-
jaxrs容器负责实际创建过滤器,然后委托给cdi执行特定于 CDI 的注入。这就是为什么字段注入有效,但构造函数注入无效。 -
感谢您的评论。有没有办法让 JAX-RS 在 CDI 上下文中查找其组件?
标签: jax-rs cdi open-liberty