jakarta-ee - JAX-RS:自定义类对象未注入(inject) ContainerRequestFilter

标签 jakarta-ee jax-rs cdi

我创建了一个 ContainerRequestFilter 实现,如下所示:

@Provider
@PreMatching
@Secured
@Dependent
public class BearerFilter implements ContainerRequestFilter
{

    @Inject protected MemcachedApplicationResources memcachedResources;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {
        //this.memcachedResources is null here.
    }
}

如您所见,我正在尝试将 MemcachedApplicationResources 对象注入(inject)到 memcachedResources 字段中。

MemcachedApplicationResources 就像:

@ApplicationScoped
public class MemcachedApplicationResources {}

为什么它是null

编辑

我刚刚创建了一个包含以下内容的 beans.xml 文件:

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

</beans>

但是,它仍然是null

enter image description here

编辑 2

我还尝试创建一个 Filter 而不是 ContainerRequestFilter:

@WebFilter(
    dispatcherTypes = {DispatcherType.REQUEST },
    urlPatterns = { "/cmng/*" },
    initParams = { @WebInitParam(name = "excludedPaths", value = "log") }
    )
public class BearerWebFilter implements Filter
{

    @Inject protected MemcachedResources memcachedResources;

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
        //here, this.memcachedResources is a injected proxy!
    }
}

为什么要使用 Filter 类来注入(inject)字段?

最佳答案

如果出现以下情况,注入(inject)应该有效:

  • 您在 WEB-INF 下有一个 beans.xml 文件(对于 CDI 1.2 不是必需的)。
  • 您的过滤器是由 CDI 管理的 bean。

根据您的容器,您可能需要额外的依赖项才能使 CDI 与 RESTEasy 一起工作,但它应该与 WildFly 一起开箱即用。查看documentation了解更多详情。


如果它不起作用,您仍然可以尝试使用以下方法以编程方式获取实例:

MemcachedApplicationResources bean = 
    CDI.current().select(MemcachedApplicationResources.class).ge‌​t();

关于jakarta-ee - JAX-RS:自定义类对象未注入(inject) ContainerRequestFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45755377/

相关文章:

java - 通过 Producer 类将 RequestScoped CDI Bean 注入(inject) ApplicationScoped CDI Bean

java - 在 servlet 中加载属性文件

java - "LocalBean"和 "Remote"都可以在一个 bean 上注释吗?

rest - 如何在 Servlet 3.0 容器中将 JAX-RS 与 CDI 集成

java - jax-rs, Jersey 原型(prototype),似乎无法使用@WebListener

java - 使用 InjectionPoint 在注入(inject)和检索时传递参数

jsf - 如何在 JSF 2.0/2.1 中用 CDI 替换 @ManagedBean/@ViewScope

jakarta-ee - Spring @Profile 的 EJB 对应项

java - 将多个@queryParam映射到单个对象

java - Apache CXF : jax-rs Client - GET Array of Objects