CDI:未注入的ContainerRequestFilter属性

时间:2017-08-18 09:50:17

标签: java-ee jax-rs cdi

我已经创建了ContainerRequestFilter实现。我正面对一些我不太理解的误会。

这是我的实施:

@Provider
@PreMatching
@Secured
public class BearerFilter implements ContainerRequestFilter
{
    @Context private HttpServletRequest request;

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

为了在我的jaxrs应用程序中注册它:

@ApplicationPath(value = "cmng")
public class RestApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<Class<?>>();
        resources.add(AccountEndpoint.class);
        //...
        return resources;
    }

    @Override
    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<Object>();
        singletons.add(new BearerFilter());  <<<<< manually created object.
        return singletons;
    }
}

因此,BearerFilter对象是通过代码手动创建的。此处出现问题,因为依赖注入仅适用于由容器本身创建和管理的实例。

所以我无法在ContainerRequestFilter内注入对象,因为它不是容器本身创建或管理的对象。

我怎么能解决这个问题?

我正在使用jaxrs。

1 个答案:

答案 0 :(得分:1)

@Context注释来自JAX-RS,它与CDI无任何关系。可以在此@Context中看到可以使用answer注入的可用类型。

根据getSingletons()方法documentation,注入工作:

  

获取一组根资源,提供程序和功能实例。 返回实例的字段和属性在使用前由运行时注入其声明的依赖项(请参阅Context

但您始终可以使用getClasses()方法注册过滤器:

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(AccountEndpoint.class);
    classes.add(BearerFilter.class)
    return classes;
}

来自documentation

  

获取一组根资源,提供程序和要素类。资源类实例的默认生命周期是每个请求。 提供商的默认生命周期(直接注册或通过功能注册)是单身。