4

In short, I have a Jersey REST service in a jar that I need to deploy in my webapp using mapping that differs from that which is defined in the annotations of the service. In the service, I have @ApplicationPath("/rest") and @Path("/foo"). However, incoming requests will be of the form: http://example.com/delegate/rest/foo (note that delegate is NOT a context path, rather it is mapped to servlet in the ROOT webapp that loads session information and proxies the request to my webapp, which means I cannot override @ApplicationPath with a servlet-mapping as would usually be the case). So, what I am trying to do, is this:

@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 );
    }
}

However, this ends up failing to match. Is it not possible to modify the path portion of the URI in a @PreMatching filter? I thought that is what this type of filter was for...

Lucas
  • 14,227
  • 9
  • 74
  • 124

1 Answers1

4

I hate when I find my own answer MINUTES after posting... Anyway, the baseUri MUST end in a /. So changing this:

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

to this:

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

did the trick.

Lucas
  • 14,227
  • 9
  • 74
  • 124
  • Thanks for posting. I had opposite problem but your solution helped--I was modifying the path portion, not base uri, and path has to *start* with a "/". So I had to prepend the "/". – chacmool Jun 21 '17 at 16:17