Rest 使用预匹配筛选器更改uri路径

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

简而言之,我在jar中有一个Jersey REST服务,我需要使用不同于服务注释中定义的映射在我的webapp中部署它。在服务中,我有
@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,路径必须以“/”开头。所以我必须在“/”前面加上前缀。