Java 当响应实体为字符串时,在底拖过滤器内标识PathParam
我需要从一个请求中识别@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
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();
}