使用 JAX-RS 中的路径参数拦截特定路径

Intercept for a specific path with path parameter in JAX-RS

在我的 REST api 中,我有一个包含多个子资源的资源。有什么方法可以拦截对该资源的任何调用,然后继续正常执行吗?

例如:

/some-resource/{resource-id}

是基本路径,我有多个子资源,例如

/some-resource/{resource-id}/sub-resource1/...
/some-resource/{resource-id}/sub-resource2/...
...

这些子资源具有复杂的结构,提供者在许多不同的 类。

那么有什么方法可以拦截对以路径 /some-resource/{resource-id} 开头的资源的每次调用吗?所谓拦截,我的意思是调用一个以资源 ID 作为参数的方法,该方法在任何子资源实现之前调用,并且可以通过抛出异常来取消请求,但不会干扰正常执行。

显然,您可以使用 sub-resource locators 让您的代码在每次请求基本路径时调用。它似乎不是为拦截而设计的,因为你需要,好吧,找到我不想做的子资源。

还有其他想法吗?

您可以为此使用 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
    }
}