Jersey REST 扩展方法
Jersey REST extending methods
我想知道是否可以使用球衣 restful 资源执行以下技巧:
我有一个示例球衣资源:
@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方法隐式地从注解中检查权限,而无需在方法体内实际编写调用。此资源中的 "decorating" 每种球衣方法。
有没有优雅的解决方案?例如球衣供应商?
谢谢!
使用 Jersey 2 可以使用 ContainerRequestFilter
。
@Provider
public class CheckPermissionsRequestFilter
implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext crc) throws IOException {
}
}
我们可以通过ResourceInfo
class
获取调用方法上的注解
@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或资源方法
- 在 Filters and Interceptors
查看更多
更新
上面的注释也允许注释 classes。为了完整起见,您还需要检查 class。像
Class resourceClass = info.getResourceClass();
CheckPermissions checkPermissions = resourceClass.getAnnotation(CheckPermissions.class);
if (checkPermissions != null) {
String[] persmission = checkPermissions.value();
}
我想知道是否可以使用球衣 restful 资源执行以下技巧:
我有一个示例球衣资源:
@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方法隐式地从注解中检查权限,而无需在方法体内实际编写调用。此资源中的 "decorating" 每种球衣方法。
有没有优雅的解决方案?例如球衣供应商?
谢谢!
使用 Jersey 2 可以使用 ContainerRequestFilter
。
@Provider
public class CheckPermissionsRequestFilter
implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext crc) throws IOException {
}
}
我们可以通过ResourceInfo
class
@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({...})
- 在 Filters and Interceptors 查看更多
更新
上面的注释也允许注释 classes。为了完整起见,您还需要检查 class。像
Class resourceClass = info.getResourceClass();
CheckPermissions checkPermissions = resourceClass.getAnnotation(CheckPermissions.class);
if (checkPermissions != null) {
String[] persmission = checkPermissions.value();
}