我在Glassfish 4.0下运行了Jersey 2.x servlet。有一种方法可以处理表单提交:
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("/{serial}")
public Response saveUnit(....) { ... }
我收到消息“对...的servlet请求包含请求体中的表单参数,但请求体已被servlet或访问请求参数的servlet过滤器使用。”
但是,我没有定义任何过滤器。除了Glassfish和Jersey默认做的任何事情。
但我确实有一个监听器(我已经忘记了)。
我怀疑这就是为什么我尝试使用MultivaluedMap无效。
有什么想法消耗了这个请求?
这是Jersey方法:
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("/{unitid}")
public Response saveUnit(@PathParam("unitid")int unitId, @Context UriInfo uri) {
MultivaluedMap<String, String> queryParams = uri.getQueryParameters();
for (String k:queryParams.keySet()) {
logger.info(k);
}
return Response.ok().build();
}
地图queryParams为空。
这是我的web.xml。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>mycompany.ApplicationConfig</servlet-name>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>mypackage</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mycompany.ApplicationConfig</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<listener>
<listener-class>mycompany.ServletContextClass</listener-class>
</listener>
</web-app>
答案 0 :(得分:1)
要获取资源方法中收到的表单参数,请将方法的签名更改为:
public Response saveUnit(@PathParam("unitid") int unitId,
final javax.ws.rs.core.Form form) {
...
}
或
public Response saveUnit(@PathParam("unitid") int unitId,
final MultivaluedMap<String, String> formData) {
...
}
泽西岛将填补价值。
根据您的方法,您要求泽西岛返回查询参数的地图(这是URI的一部分,并从您想要Form
参数的问题中假设。)