RESTEasy:@POST方法中的@Form反序列化问题

时间:2013-09-27 22:47:10

标签: json post jackson resteasy

这是一个谜题! 在一个简单的POST实现中:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response promote(@Form PromotionForm promotion) {
return Response.status(Response.Status.OK)
               .entity(promotion.toString())
               .build();
}

传递给我的参数没有设置值:

PromotionForm{name='null', csid=null}

但是在调试器中我可以看到收到的请求服务器在其输入流中具有值:

new BufferedReader(new InputStreamReader(
((HttpServletInputMessage) request).getInputStream())).readLine()
// returns: {"name":"form","csid":123}

经过一些调试后,我发现RESTEasy试图为POST方法调用派生参数:

args[i++] = extractor.inject(input, response);

导致FormInjector代码:

propertyInjector.inject(request, response, target);

最终到FormParamInjector:

List<String> list = request.getDecodedFormParameters().get(paramName);

但是request.getDecodedFormParameters()大小为0. RESTeasy不会尝试阅读 由于某种原因,来自请求输入流的任何内容。

我是如何让RESTeasy正确填充PromotionForm对象的?

以下更多信息。

感谢所有人提前回答和评论。

客户来电是:

    final PromotionForm form = new PromotionForm();
    form.setName("form");
    form.setCsid(123L);
    final Response response = new ResteasyClientBuilder()
            .disableTrustManager()
            .build()
            .target(targetField.getValue())
            .request(requestField.getValue())
            .cookie(cookieNameField.getValue(), cookieValueField.getValue())
            .buildPost(Entity.entity(form, MediaType.APPLICATION_JSON_TYPE))
            .invoke();

PromotionForm:

import javax.ws.rs.FormParam;

public class PromotionForm {
  @FormParam("name")
  private String name;
  @FormParam("csid")
  private Long csid;

  // setters & getters omitted

依赖关系:

    <dependency>
       <groupId>org.jboss.resteasy</groupId>
       <artifactId>resteasy-jaxrs</artifactId>
       <version>3.0.4.Final</version>
    </dependency>

    <dependency>
       <groupId>org.jboss.resteasy</groupId>
       <artifactId>resteasy-jackson2-provider</artifactId>
       <version>3.0.4.Final</version>
    </dependency>

    <!-- scannotation & resteasy-client ommitted -->

web.xml片段:

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>

<servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<context-param>
    <!--If the url-pattern for the Resteasy servlet-mapping is not /*-->
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/rest</param-value>
</context-param>

1 个答案:

答案 0 :(得分:4)

您的方法说它消耗application/json。但是PromotionForm - 类有@FormParam - 注释,顾名思义,consumes form data

要解决此问题,请执行以下操作之一:

尝试发布表单数据而不是json。并将@Consumes - 注释值更改为application/x-www-form-urlencoded

OR

删除@Form - 注释。在PromotionForm上添加JAXB注释,以便您发布的json数据可以映射到PromotionForm - 类。