0

这是一个谜题!在一个简单的 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();

推广表格:

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>
4

1 回答 1

4

你的方法说它消耗application/json. 但是PromotionForm-class 有@FormParam-annotations,顾名思义,它使用表单数据

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

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

或者

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

于 2013-09-28T20:28:46.193 回答