Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey ContainerRequestFilter-修改查询参数不会修改控制器中的上下文请求_Java_Tomcat_Jersey_Context Injection - Fatal编程技术网

Java Jersey ContainerRequestFilter-修改查询参数不会修改控制器中的上下文请求

Java Jersey ContainerRequestFilter-修改查询参数不会修改控制器中的上下文请求,java,tomcat,jersey,context-injection,Java,Tomcat,Jersey,Context Injection,jersey 2.23中的以下过滤器在tomcat 7.0.69中运行: @PreMatching @Priority(Priorities.HEADER_DECORATOR) public class TestFilter implements ContainerRequestFilter { @Context HttpServletRequest req; @Override public void filter(ContainerRequestContex

jersey 2.23中的以下过滤器在tomcat 7.0.69中运行:

@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);
    ...
}
然后我提出一项要求:

我预计产出为:

Context query string: a=c
Query param value: c
然而,输出是:

Context query string: a=b
Query param value: c

因此,我的过滤器修改了使用
@QueryParam
解析的查询参数,但它没有改变注入的上下文。注入的上下文不应该也被预匹配过滤器修改吗?

servlet层,HttpServletRequest不会被修改。对请求的修改仍保留在泽西岛。如果使用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规范,您应该在


如果您需要修改
HttpServletRequest
对象,您可能会在SO:

找到有用的Michal答案,谢谢您的回答。实际上,注入的UriInfo对象具有修改的查询参数。但是,我没有看到在过滤器中修改HttpServletRequest对象的方法。我可以使用setProperty(),但这似乎只是在请求上设置一个属性。螺纹局部注射不起作用。我想在泽西岛项目中提交一个票证,但是似乎我需要创建一个帐户,这目前是不可能的。关于如何提交车票有什么想法吗?很抱歉造成混乱
ThreadLocal
仅在筛选器为单例且Jersey 2.x中似乎不支持时才有用。无论如何,修改HttpServletRequest确实很复杂,尤其是在没有标准API的情况下。请查看此答案,它可能会对您有所帮助: