java Jersey InjectableProvider如何依赖于资源的AbstractMethod?
我有一个ResourceFilterFactory
,如果AbstractMethod
上存在注释,它将返回一个ContainerRequestFilter
筛选器读取cookie或API密钥并检查其是否仍然有效,并在请求上设置属性。该检查非常昂贵,因此我只希望它在注释存在时发生
我想将结果对象注入到我的资源中,但注入似乎发生在应用ResourceFilterFactory
过滤器之前。如果我将过滤器作为PROPERTY_CONTAINER_REQUEST_FILTERS
添加到ResourceConfig
,那么它发生在注入之前,但它没有访问AbstractMethod
的权限
如何弥合差距,以便仅当方法具有注释时应用过滤器并注入字段
我的代码看起来像这样AuthFilter
在UserIdProvider
之后调用,因此c.getProperties().get(USER_ID_PROPERTY)
始终是null
public class AuthFilter implements ContainerRequestFilter {
public ContainerRequest filter(ContainerRequest request) {
Integer userId = …; // expensive lookup
request.getProperties().set(USER_ID_PROPERTY, userId);
return request;
}
}
public class AuthFilterFactory implements ResourceFilterFactory {
// …
public List<ResourceFilter> create(AbstractMethod am) {
if (am.isAnnotationPresent(RequireAuth.class) || am.getResource().isAnnotationPresent(RequireAuth.class)) {
return Collections.singletonList(new ResourceFilter() {
public ContainerRequestFilter getRequestFilter() {
return authFilter;
}
});
}
else {
return null
}
}
}
可注入提供者:
@Provider
public class UserIdProvider implements InjectableProvider<UserId, Parameter> {
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
public Injectable<? extends Object> getInjectable(ComponentContext ic, UserId a, final Parameter t) {
return new AbstractHttpContextInjectable<Integer>() {
public Integer getValue(HttpContext c) {
return (Integer) c.getProperties().get(USER_ID_PROPERTY);
}
}
}
}
资源:
@Path("/user")
public class UserResource {
@UserId
Integer userId;
// userId should only be set on this method
@GET
@RequireAuth
public UserDetails get() {
// …
}
// the auth filter should not be called for this method
@POST
@Path("/login")
public String login() {
// …
}
}
共 (0) 个答案