Rest 使用预匹配筛选器更改uri路径
简而言之,我在jar中有一个Jersey REST服务,我需要使用不同于服务注释中定义的映射在我的webapp中部署它。在服务中,我有Rest 使用预匹配筛选器更改uri路径,rest,servlets,jersey,jax-rs,servlet-3.0,Rest,Servlets,Jersey,Jax Rs,Servlet 3.0,简而言之,我在jar中有一个Jersey REST服务,我需要使用不同于服务注释中定义的映射在我的webapp中部署它。在服务中,我有@ApplicationPath(“/rest”)和@Path(“/foo”)。但是,传入请求的格式为:http://example.com/delegate/rest/foo(请注意,委托不是上下文路径,而是映射到根webapp中的servlet,根webapp加载会话信息并将请求代理到我的webapp,这意味着我不能像通常那样使用servlet映射覆盖@App
@ApplicationPath(“/rest”)
和@Path(“/foo”)
。但是,传入请求的格式为:http://example.com/delegate/rest/foo
(请注意,委托不是上下文路径,而是映射到根webapp中的servlet,根webapp加载会话信息并将请求代理到我的webapp,这意味着我不能像通常那样使用servlet映射覆盖@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的路径部分?我认为这就是这种筛选器的用途…我讨厌在发布后几分钟内找到自己的答案…无论如何,baseUri
必须以//code>结尾。因此更改此项:
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() ).build();
为此:
URI baseUri = uriInfo.getBaseUriBuilder()
.path( uriInfo.getPathSegments().get( 0 ).getPath() + "/" ).build();
成功了。谢谢你的帖子。我遇到了相反的问题,但你的解决方案有所帮助——我修改了路径部分,而不是基本uri,路径必须以“/”开头。所以我必须在“/”前面加上前缀。