有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jersey InjectableProvider如何依赖于资源的AbstractMethod?

我有一个ResourceFilterFactory,如果AbstractMethod上存在注释,它将返回一个ContainerRequestFilter

筛选器读取cookie或API密钥并检查其是否仍然有效,并在请求上设置属性。该检查非常昂贵,因此我只希望它在注释存在时发生

我想将结果对象注入到我的资源中,但注入似乎发生在应用ResourceFilterFactory过滤器之前。如果我将过滤器作为PROPERTY_CONTAINER_REQUEST_FILTERS添加到ResourceConfig,那么它发生在注入之前,但它没有访问AbstractMethod的权限

如何弥合差距,以便仅当方法具有注释时应用过滤器并注入字段

我的代码看起来像这样AuthFilterUserIdProvider之后调用,因此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) 个答案