2

ジャージーの安らかなリソースで次のトリックを実行できるかどうか疑問に思っていました:

ジャージリソースの例があります:

@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 メソッドを呼び出して、アノテーションから権限を暗黙的にチェックすることです。このリソース内の各ジャージ メソッドを「装飾」するようなものです。

エレガントなソリューションはありますか?たとえば、ジャージープロバイダーでは?

どうも!

4

1 に答える 1

3

ジャージ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();
}
于 2015-01-09T14:55:02.657 に答える