使用 PreMatching 过滤器更改 uri 路径
Using a PreMatching filter to change uri path
简而言之,我在 jar 中有一个 Jersey REST 服务,我需要使用与服务注释中定义的映射不同的映射将其部署到我的 webapp 中。在服务中,我有 @ApplicationPath("/rest")
和 @Path("/foo")
。但是,传入的请求将采用以下形式:http://example.com/delegate/rest/foo
(请注意,delegate 不是上下文路径,而是映射到加载会话信息的 ROOT webapp 中的 servlet 和将请求代理到我的 webapp,这意味着我不能像通常那样用 servlet-mapping
覆盖 @ApplicationPath
)。所以,我想做的是:
@PreMatching
@Priority( 500 )
public class DelegateRemappingFilter implements ContainerRequestFilter {
private static final Logger LOGGER = LoggerFactory.getLogger( DelegateRemappingFilter.class );
@Override
public void filter( ContainerRequestContext requestContext ) throws IOException {
UriInfo uriInfo = requestContext.getUriInfo();
// convert baseUri to http://example.com/delegate/rest
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() ).build();
URI requestUri = uriInfo.getRequestUri();
// As expected, this will print out
// setRequestUri("http://example.com/delegate/rest","http://example.com/delegate/rest/foo")
LOGGER.debug( "setRequestUri(\"{}\",\"{}\")", baseUri, requestUri );
requestContext.setRequestUri( baseUri, requestUri );
}
}
然而,这最终无法匹配。是否无法在 @PreMatching
过滤器中修改 URI 的路径部分?我认为这就是这种过滤器的用途...
我讨厌在发帖后 MINUTES 找到自己的答案...无论如何,baseUri
MUST 以一个/
。所以改变这个:
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() ).build();
对此:
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() + "/" ).build();
成功了。
简而言之,我在 jar 中有一个 Jersey REST 服务,我需要使用与服务注释中定义的映射不同的映射将其部署到我的 webapp 中。在服务中,我有 @ApplicationPath("/rest")
和 @Path("/foo")
。但是,传入的请求将采用以下形式:http://example.com/delegate/rest/foo
(请注意,delegate 不是上下文路径,而是映射到加载会话信息的 ROOT webapp 中的 servlet 和将请求代理到我的 webapp,这意味着我不能像通常那样用 servlet-mapping
覆盖 @ApplicationPath
)。所以,我想做的是:
@PreMatching
@Priority( 500 )
public class DelegateRemappingFilter implements ContainerRequestFilter {
private static final Logger LOGGER = LoggerFactory.getLogger( DelegateRemappingFilter.class );
@Override
public void filter( ContainerRequestContext requestContext ) throws IOException {
UriInfo uriInfo = requestContext.getUriInfo();
// convert baseUri to http://example.com/delegate/rest
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() ).build();
URI requestUri = uriInfo.getRequestUri();
// As expected, this will print out
// setRequestUri("http://example.com/delegate/rest","http://example.com/delegate/rest/foo")
LOGGER.debug( "setRequestUri(\"{}\",\"{}\")", baseUri, requestUri );
requestContext.setRequestUri( baseUri, requestUri );
}
}
然而,这最终无法匹配。是否无法在 @PreMatching
过滤器中修改 URI 的路径部分?我认为这就是这种过滤器的用途...
我讨厌在发帖后 MINUTES 找到自己的答案...无论如何,baseUri
MUST 以一个/
。所以改变这个:
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() ).build();
对此:
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() + "/" ).build();
成功了。