使用 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
}
}
在我的 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
}
}