1

我在 Glassfish 4 上使用 Jersey 2.3.1。

我的资源方法类似于以下:

        @POST
        @Consumes("application/x-www-form-urlencoded")
        @Path("/update")
        public Response update(MultivaluedMap<String, String> formParams){
    //business logic
    //return appropriate Response object
    }

我总是formParams.size()归零。为什么提交的表单参数在对象中不可用MultivaluedMap

服务器日志中的以下警告消息:

警告:对 URI 的 servlet 请求http://localhost:8080/myApp/resource/update在请求正文中包含表单参数,但请求正文已被 servlet 或访问请求参数的 servlet 过滤器使用。只有使用 @FormParam 的资源方法才能按预期工作。通过其他方式消耗请求正文的资源方法将无法按预期工作。

(我在禁用所有 Servlet 过滤器之前和之后进行了测试。我没有使用任何 Jersey 过滤器)

4

1 回答 1

2

如果已通过调用 HttpServletResponse.getParameter(paramName) 使用了带有表单数据的请求正文,则会收到此消息。如果任何已注册的 servlet 过滤器调用此方法,就会发生这种情况。Jersey ContainerRequestFilter 无法影响它。所以我建议调查你的部署配置(web.xml)。我已经用 Jersey 2.5-SNAPSHOT 和 Glassfish 4 night build (glassfish-4.0.1-b04-12_04_2013) 测试了注入 Form 实体,它可以工作。

如果请求正文已被使用,您仍然可以使用表单参数,但不能将它们作为实体注入(如在您的代码中)。如果使用参数,您可以使用 @FormParam JAX-RS 注解注入参数:

@POST
@Consumes("application/x-www-form-urlencoded")
public String postForm(@FormParam("paramKey") String paramValue) {
    return paramValue;
}
于 2013-12-11T12:57:03.843 回答