基于自定义注释的拦截器过滤器球衣

时间:2015-04-01 04:25:20

标签: java annotations jersey

我正在使用球衣作为我的休息客户。我想写一个自定义注释,它将拦截请求,以便我可以验证用户并相应地抛出错误。所以我只能注释那些我想要验证的函数。它周围有两个问题。

  1. 据我所知,他们在实际调用之前都注入了注释属性。如何在调用此函数时控制。我需要访问@Context HttpServletRequest请求部分以获取userId并进行数据库调用以进行验证..

  2. 要注释我的注释解析器的类需要事先知道。我怎样才能使这个独立于此。像春天的注释。

    @MYCustomFIlter
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/{programId}/processCount")
    public Response getProgramInitializedCount(@PathParam("programId") String programId,
         @Context HttpServletRequest request)  {
     //this line will be moved to annotation filter.
     String userId = WfManagerUtil.getCurrentUser(request);
    
  3. 有关此问题的任何想法如何实现。

    第一次编辑:  通过一些研究,我发现了如何做到这一点。但这不会发生。有人可以帮我找出原因。

    注释:

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ValidateUser {
    
    }
    

    过滤器:

     public class ValidateUserFilter implements ContainerRequestFilter {
    
    
         @Override
         public ContainerRequest filter(ContainerRequest request) throws WebApplicationException{
    
             String user = request.getHeaderValue(USER_HEADER);
             //rest of code.
    
         }
     }
    

    绑定:

    @Provider
    public class ResourceFilterBindingFeature implements DynamicFeature {
    
      @Override
      public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        if (resourceInfo.getResourceMethod().isAnnotationPresent(ValidateUser.class)) {
          context.register(CommonResourceFilter.class);
        }
    
      }
    }
    

    并将其用作:

    @Path("/v1.0/programs")
    public class ProgramsResource {
    
    
         @ValidateUser
         @GET
         @Produces(MediaType.APPLICATION_JSON)
         @Path("/{programId}/initialization/progress/")
         public Response getProgramInitializedCount(@PathParam("programId") String programId,
                 @Context HttpServletRequest request) throws WorkflowManagerException {
             //code
         }
    
    }
    

    POM:

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0.1</version>
    </dependency>
    
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.8</version>
        <!-- <scope>provided</scope> -->
    </dependency>
    
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
        <!-- <scope>provided</scope> -->
    </dependency> 
    

    我可能在哪里做错了。没有调用过滤器类。

0 个答案:

没有答案