我在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过滤器之前和之后进行了测试。我没有使用任何泽西过滤器)
答案 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;
}