对于我的 REST 服务中的订购过程,我必须将“文章”列表从客户端发送到服务器。这些物品对象是自制的实体类型。我已经发现发送 STRING 或 INTEGER 对象列表确实有效,通过@FormParam 发送。
但是,一旦我尝试发送我自己的对象列表(甚至只有一个对象),我总是会收到HTTP 400 错误 "Bad Request"。
我尝试了与下面相同的代码(仅更改了 form.add() 的参数和服务器方法的参数)并成功地 postet 字符串、整数和字符串列表。它只会使发送自己的对象类型出现问题。
日志记录告诉我未达到服务器方法。该过程之前的某个地方被破坏了。
我还尝试使用代理(Apache JMeter)来获取请求。这里它说参数kunde
包含 value entities.Kunde%40af8358
。所以我猜这个对象没有彻底(或根本没有)序列化。但是在响应中将这种对象从服务器发送到客户端工作正常——这里 XML 序列化没有问题。
可能是什么原因?是否可能无法通过 POST 发送自己的类型?
(PS:Kunde
我的示例中的类型是可序列化的,并带有注释@XmlRootElement
。)
预先感谢您的帮助!
亚娜
注意:我使用的是 SAP Netweaver AS。但到目前为止,它的行为与其他所有 Java AS 一样,所以我认为这不会是原因。其他所有 REST 操作都可以正常工作,即使 POST 没有自己的实体。
另外:我正在使用 JERSEY 库。
我在服务器端的代码:
@Path("/test")
@POST
@Produces(MediaType.TEXT_XML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String test(
@FormParam("kunde") Kunde kunde) {
return "The name of the customer is: "
+kunde.getVorname()+" "+kunde.getNachname();
}
我在客户端的代码(该方法在会话 Bean 中):
public String test() {
Kunde kunde = new Kunde();
kunde.setNachname("Müller");
kunde.setVorname("Kurt");
Form form = new Form();
form.add("kunde", kunde);
return service
.path("test")
.type(MediaType.APPLICATION_FORM_URLENCODED)
.accept(MediaType.TEXT_XML)
.post(String.class, form);
}
服务是这样构建的:
com.sun.jersey.api.client.Client;
com.sun.jersey.api.client.WebResource;
com.sun.jersey.api.client.config.ClientConfig;
com.sun.jersey.api.client.config.DefaultClientConfig;
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
service = client.resource(UriBuilder.fromUri("<service-url>").build());