在我的REST api中,我有一个包含多个子资源的资源。有没有什么方法可以拦截对该资源的任何调用,然后继续正常执行?
例如:
/some-resource/{resource-id}
是基本路径,我有多个子资源,如
/some-resource/{resource-id}/sub-resource1/...
/some-resource/{resource-id}/sub-resource2/...
...
这些子资源具有复杂的结构,提供者有许多不同的类。
那么有没有办法拦截对以/some-resource/{resource-id}
路径开头的资源的每次调用?截取我的意思是调用一个方法,将resource-id作为在任何子资源实现之前调用的参数,并且可以通过抛出异常来取消请求,但不会干扰正常执行。
显然,您可以使用sub-resource locators让您在每次请求基本路径时调用代码。它似乎不是为拦截而设计的,但是你需要找到我不想做的子资源。
还有其他想法吗?
答案 0 :(得分:2)
您可以使用RequestFilter:
@Provider
public class SomeResourceFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if (isSubresourceOfSomeResource(requestContext)) {
intercept(resourceId(requestContext));
}
}
private boolean isSubresourceOfSomeResource(ContainerRequestContext requestContext) {
List<PathSegment> pathSegments = requestContext.getUriInfo().getPathSegments();
return "some-resource".equals(getSegment(requestContext, 0)) && pathSegments.size() > 2;
}
private String resourceId(ContainerRequestContext requestContext) {
return getSegment(requestContext, 1);
}
private String getSegment(ContainerRequestContext requestContext, int index) {
return requestContext.getUriInfo().getPathSegments().get(index).getPath();
}
private void intercept(String resourceId) {
// your code
}
}