使用PreMatching过滤器更改uri路径

时间:2015-12-04 14:47:25

标签: rest servlets jersey jax-rs servlet-3.0

简而言之,我在一个jar中有一个Jersey REST服务,我需要在我的webapp中使用不同于服务注释中定义的映射进行部署。在服务中,我有@ApplicationPath("/rest")@Path("/foo")。但是,传入的请求将采用以下格式:http://example.com/delegate/rest/foo(请注意,委托不是上下文路径,而是映射到ROOT webapp中的servlet,它加载会话信息并代理请求到我的webapp,这意味着我不能用@ApplicationPath覆盖servlet-mapping,这通常是这种情况。所以,我想做的是:

@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的路径部分?我认为这就是这种过滤器的用途......

1 个答案:

答案 0 :(得分:3)

我讨厌在发布后找到自己的答案 MINUTES ...无论如何,baseUri 必须/结尾。所以改变这个:

    URI baseUri = uriInfo.getBaseUriBuilder()
            .path( uriInfo.getPathSegments().get( 0 ).getPath() ).build();

到此:

    URI baseUri = uriInfo.getBaseUriBuilder()
            .path( uriInfo.getPathSegments().get( 0 ).getPath() + "/" ).build();

做了这个伎俩。