Java Jersey:在资源筛选器中使用提供程序

Java Jersey:在资源筛选器中使用提供程序,java,jersey,spring-3,Java,Jersey,Spring 3,使用Jersey 1.14和Spring 3.1.2 我想创建一个如下所示的过滤器: 但在该过滤器中,我希望访问我创建的提供者 我得到了一个非法状态异常。我怀疑我生命周期中的某些东西被水淹没了。我可以访问@Context-private-HttpServletRequest并从那里获取所需的会话信息,但是两个类必须知道从哪里/如何获取我的“AuthUser”对象 感谢您的帮助 我的提供商: @组件 @提供者 公共类AuthUserProvider扩展了AbstractHttpContextInj

使用Jersey 1.14和Spring 3.1.2

我想创建一个如下所示的过滤器:

但在该过滤器中,我希望访问我创建的提供者

我得到了一个非法状态异常。我怀疑我生命周期中的某些东西被水淹没了。我可以访问
@Context-private-HttpServletRequest
并从那里获取所需的会话信息,但是两个类必须知道从哪里/如何获取我的“AuthUser”对象

感谢您的帮助

我的提供商:

@组件
@提供者
公共类AuthUserProvider扩展了AbstractHttpContextInjectable实现
可注射提供者{
私有静态最终记录器LOG=LoggerFactory.getLogger(AuthUserProvider.class);
@上下文
HttpServletRequestReq;
公共void init(){
LOG.debug(“创建”);
}
@凌驾
//这可能会返回一个空AuthUser,这是我们想要的…记住,一个
//null AuthUser表示用户尚未进行身份验证
公共AuthUser getValue(HttpContext ctx){
return(AuthUser)req.getSession().getAttribute(AuthUser.KEY);
}
//InjectableProvider实现:
公共组件范围getScope(){
返回ComponentScope.Singleton;
}
公共可注入getInjectable(ComponentContext ic,Context ctx,类型c){
if(AuthUser.class.equals(c)){
归还这个;
}
返回null;
}
}
我的过滤器:

@组件
公共类TodoFilter实现ResourceFilter{
私有静态最终记录器LOG=LoggerFactory.getLogger(TodoFilter.class);
@自动连线
私有JdbcTemplate进行模板化;
//这很有效
@上下文
私有HttpServletRequest-servletRequest;
//这将抛出java.lang.IllegalStateException
//@Context
//私人身份验证用户;
public void init()引发异常{
LOG.debug(“创建”);
LOG.debug(todoTemplate.getDataSource().getConnection().getMetaData()
.getDatabaseProductName());
}
@凌驾
public ContainerRequestFilter getRequestFilter(){
返回新的ContainerRequestFilter(){
@凌驾
公共ContainerRequest筛选器(ContainerRequest请求){
debug(“检查{}是否有权使用{}”,“我的身份验证用户”,
request.getPath());
//字符串名称=request.getUserPrincipal().getName();
//字符串[]admins=settings.getAdminUsers();
//用于(字符串adminName:admins){
//if(adminName.equals(name))
//返回请求;
// }
//if(authUser.getUsername().equals(“jberk”)){
//返回请求;
// }
//如果在管理用户中找不到名称,则返回HTTP 403
抛出新的WebApplicationException(Response.status(Response.status.FORBIDDEN)
.entity(“您未经授权!”).build();
}
};
}
@凌驾
public ContainerResponseFilter getResponseFilter(){
返回新的ContainerResponseFilter(){
@凌驾
公共ContainerResponse筛选器(ContainerRequest请求,
ContainerResponse(响应){
//无所事事
返回响应;
}
};
}
}
我的服务(又名资源):

@组件
@路径(“/rs/todo”)
@产生(MediaType.APPLICATION_JSON)
@ResourceFilters(TodoFilter.class)
公共类TodoService{
@GET/@POST方法
}

所以我想我找到了答案

我将此添加到我的ResourceFilter中:

@Context
private HttpContext ctx;
@Autowired
private AuthUserProvider provider;
然后我可以在filter方法中执行此操作:

public ContainerRequest filter(ContainerRequest request) {
       AuthUser authUser = provider.getValue(ctx);
       // use authuser in some way
}
这可能不是“正确的”…但它正在工作,我没有代码重复

public ComponentScope getScope() {
    return ComponentScope.Singleton;
}
应该是

public ComponentScope getScope() {
    return ComponentScope.PerRequest;
}