我正在构建一个应在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规范...
答案 0 :(得分:1)
这是一个很长的故事...有些人正在努力解决这个问题: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