Jersey / Glassfish:什么是消耗POST参数?

时间:2014-01-07 18:13:43

标签: glassfish jersey-2.0

我在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>

1 个答案:

答案 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参数的问题中假设。)