Jersey ContainerRequestFilter - 修改查询参数不会修改控制器

时间:2016-05-27 02:39:33

标签: java tomcat jersey context-injection

我在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过滤器修改注入的上下文吗?

1 个答案:

答案 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