Jersey REST扩展方法

时间:2015-01-09 14:20:05

标签: java rest jersey jax-rs webresource

我想知道是否可以使用泽西宁静资源执行以下技巧:

我有一个示例泽西资源:

@Path("/example")
public class ExampleRessource {


  @GET
  @Path("/test")
  @CustomPermissions({"foo","bar"})
  public Response doStuff() {
    //implicit call to checkPermissions(new String[] {"foo","bar"}) 

  }  

  private void checkPermissions(String[] permissions) {
    //stuff happens here
  }

}

我想要实现的是:在执行每个资源的方法之前,通过调用checkPermissions方法隐式检查注释中的权限,而不实际在方法体内编写调用。有点“装饰”这个资源里面的每个球衣方法。

有优雅的解决方案吗?例如,使用球衣提供者?

THX!

1 个答案:

答案 0 :(得分:3)

使用Jersey 2可以使用ContainerRequestFilter

@Provider
public class CheckPermissionsRequestFilter 
                                     implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext crc) throws IOException {

    }  
}

我们可以通过ResourceInfo

获取被调用方法的注释
@Context
private ResourceInfo info;

@Override
public void filter(ContainerRequestContext crc) throws IOException {
    Method method = info.getResourceMethod();
    CheckPermissions annotation = method.getAnnotation(CheckPermissions.class);
    if (annotation != null) {
        String[] permissions = annotation.value();
    }
} 

您可以使用此注释

@NameBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPermissions {
    String[] value();
}

使用@CheckPermissions({...})

注释资源类或资源方法

更新

上面的注释也允许注释类。为了完整起见,你还要检查课程。像

这样的东西
Class resourceClass = info.getResourceClass();
CheckPermissions checkPermissions = resourceClass.getAnnotation(CheckPermissions.class);
if (checkPermissions != null) {
   String[] persmission = checkPermissions.value();
}