Java 当响应实体为字符串时,在底拖过滤器内标识PathParam

Java 当响应实体为字符串时,在底拖过滤器内标识PathParam,java,jboss,wildfly,resteasy,undertow,Java,Jboss,Wildfly,Resteasy,Undertow,我需要从一个请求中识别@PathParam,在一个拖底过滤器中,忽略它们(度量目的) 我的过滤器如下所示: public class MetricsHandler implements HttpHandler { private HttpHandler next; public MetricsHandler(HttpHandler next) { this.next = next; } @Override public void ha

我需要从一个请求中识别@PathParam,在一个拖底过滤器中,忽略它们(度量目的)

我的过滤器如下所示:

public class MetricsHandler implements HttpHandler {

    private HttpHandler next;

    public MetricsHandler(HttpHandler next) {
        this.next = next;
    }

    @Override
    public void handleRequest(HttpServerExchange exchange) throws Exception {
        MetricsListener listener = new MetricsListener();
        exchange.addExchangeCompleteListener(listener);
        next.handleRequest(exchange);
    }

    private class MetricsListener implements ExchangeCompletionListener {
        @Override
        public void exchangeEvent(HttpServerExchange exchange, NextListener nextListener) {
            try {
                String metric = exchange.getRequestURI();
                UriInfo uriInfo = ResteasyProviderFactory.getContextData(UriInfo.class);
                /*
                 * When the response entity is a String, this UriInfo is null at this point. If it's another type, the UriInfo is ok and i'm able to identify path parameters ...
                 */
                if(uriInfo != null) {
                    Collection<List<String>> pathParametersValues = uriInfo.getPathParameters(false).values();
                    for (List<String> list : pathParametersValues) {
                        for (String pathParameter : list) {
                            metric = metric.replace("/"+pathParameter, "");
                        }
                    }
                }

                Metrics.increment(metric);
            } finally {
                if (nextListener != null) {
                    nextListener.proceed();
                }
            }
        }
    }
}
当请求pathNum方法时,我能够识别“id”path参数,但我不支持pathString方法。在注释中,调用ResteasyProviderFactory.getContextData(UriInfo.class)会为pathString方法返回null

我已经用resteasy 3.0.19.Final、3.0.20.Final和3.0.22.Final测试了这种行为,所有测试结果都是一样的

调试resteasy我发现,当响应实体是整数或其他类型时,MessageBodyWriter是ResteasyJackson2Provider(my rest@生成json),并且SynchronousDispatcher.clearContextData仅在我的筛选器的ExchangeCompletionListener.exchangeEvent之后调用

但是,当响应实体是字符串时,MessageBodyWriter是StringTextStar,clearContextData在MessageBodyWriter之后调用,在my ExchangeCompletionListener之前调用,因此没有更多的contextData可查看

我不知道我是否做错了什么,或者这是否是resteasy或wildfly上可能存在的错误

        <subsystem xmlns="urn:jboss:domain:undertow:3.1">
            <buffer-cache name="default"/>
            <server name="default-server">
                <host name="default-host" alias="localhost">
                    <filter-ref name="metricsFilter"/>
                </host>
            </server>
            <servlet-container name="default">
                <jsp-config/>
                <websockets/>
            </servlet-container>
            <filters>
                <filter class-name="com.metrics.filter.MetricsHandler" module="com.metrics" name="metricsFilter"/>
            </filters>
        </subsystem>
@GET
@Path("/path/num/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response pathNum(@PathParam("id") String id) {
    return Response.ok(123).build();
}

@GET
@Path("/path/string/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response pathString(@PathParam("id") String id) {
    return Response.ok("abc").build();
}