我已经创建了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。
答案 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;
}
获取一组根资源,提供程序和要素类。资源类实例的默认生命周期是每个请求。 提供商的默认生命周期(直接注册或通过功能注册)是单身。