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