我正在构建一个应该在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
。但是,如果使用@Inject
注释字段并省略构造函数,则正确注入该字段。
MyService
类用@Stateless
注释,在beans.xml
我设置了bean-discovery-mode="all"
。
知道我做错了什么吗?这实际上应该有效吗? Weld documentation表示它应该,但我不确定它是否也在CDI规范中......
这是一个很长的故事......有些人正在努力解决这个问题: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