Jersey 2.x问题与MultivaluedMap

时间:2013-10-25 14:39:21

标签: rest java-ee jersey jax-rs glassfish-4

我在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 http://localhost:8080/myApp/resource/update的servlet请求包含请求正文中的表单参数,但请求正文已由servlet或访问请求参数的servlet过滤器使用。只有使用@FormParam的资源方法才能按预期工作。通过其他方式使用请求体的资源方法将无法按预期工作。

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

1 个答案:

答案 0 :(得分: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;
}