在JAX-RS

时间:2016-10-11 05:55:50

标签: jax-rs interceptor

在我的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让您在每次请求基本路径时调用代码。它似乎不是为拦截而设计的,但是你需要找到我不想做的子资源。

还有其他想法吗?

1 个答案:

答案 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
    }
}