我在tomcat 7.0.69中运行的泽西2.23中有以下过滤器:
@PreMatching
@Priority(Priorities.HEADER_DECORATOR)
public class TestFilter implements ContainerRequestFilter {
@Context
HttpServletRequest req;
@Override
public void filter(ContainerRequestContext conReqCtx) throws IOException {
UriBuilder b = conReqCtx.getUriInfo().getRequestUriBuilder();
b.replaceQueryParam("a", "c");
conReqCtx.setRequestUri(b.build());
}
}
过滤器替换查询参数的值" a"价值" c"。
控制器看起来像:
@Context
HttpServletRequest req;
@GET
@Path("/PathToController")
public Response get(@QueryParam("a") String val) {
System.out.println("Context query string: " + req.getQueryString());
System.out.println("Query param value:" + val);
...
}
然后我发出请求:http://localhost:8080/PathToController?a=b
我希望输出为:
Context query string: a=c
Query param value: c
然而,输出是:
Context query string: a=b
Query param value: c
所以我的过滤器修改了使用@QueryParam
解析的查询参数,但它没有改变注入的上下文。不应该通过PreMatching过滤器修改注入的上下文吗?
答案 0 :(得分:0)
servlet层,HttpServletRequest
不会被Jersey修改。对请求的修改仍在泽西岛。如果您使用了特定于JAX-RS的UriInfo
:
@Context
private UriInfo uriInfo;
@GET
@Path("/PathToController")
public Response get(@QueryParam("a") String val) {
System.out.println("Context query string: " + uriInfo.getQueryParameters());
System.out.println("Query param value:" + val);
...
}
您会看到查询参数值按预期更改。
如果您认为此行为违反了JAX-RS规范,则应在https://java.net/jira/browse/JERSEY/提交错误
如果您需要修改HttpServletRequest
对象,您可能会在SO上找到有用的Michal答案:https://stackoverflow.com/a/18331401/3114959