这是一个谜题! 在一个简单的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>
答案 0 :(得分:4)
您的方法说它消耗application/json
。但是PromotionForm
- 类有@FormParam
- 注释,顾名思义,consumes form data。
要解决此问题,请执行以下操作之一:
尝试发布表单数据而不是json。并将@Consumes
- 注释值更改为application/x-www-form-urlencoded
OR
删除@Form
- 注释。在PromotionForm
上添加JAXB注释,以便您发布的json数据可以映射到PromotionForm
- 类。