私の REST サービスでの注文プロセスでは、「記事」のリストをクライアントからサーバーに送信する必要があります。これらの記事オブジェクトは自作のエンティティ タイプです。STRING または INTEGER オブジェクトのリストの送信が機能し、@FormParam を介して送信することが既にわかっています。
しかし、自分のオブジェクトのリストを送信しようとするとすぐに (1 つのオブジェクトのみでも)、常にHTTP 400 エラー "Bad Request" が発生します。
以下のようなまったく同じコード(form.add()のパラメーターとサーバーメソッドのパラメーターのみが変更されました)とpostet文字列、整数、および文字列のリストを正常に試しました。独自のオブジェクトタイプを送信するだけで問題が発生します。
ログは、サーバー メソッドに到達していないことを示しています。プロセスはどこかで壊れています。
また、プロキシ (Apache JMeter) を使用してリクエストを取得しようとしました。ここでは、パラメーターkunde
に value が含まれていることが示されていますentities.Kunde%40af8358
。したがって、オブジェクトは完全に (またはまったく) シリアル化されていないと思います。しかし、応答でこの種のオブジェクトをサーバーからクライアントに送信すると問題なく動作します。ここでは、XML シリアル化は問題ありません。
その理由は何ですか?POST で独自の型を送信することはできないのでしょうか?
(PS:Kunde
私の例の型はシリアライズ可能で、注釈が付けられてい@XmlRootElement
ます。)
よろしくお願いします。
ジャナ
注: SAP Netweaver AS を使用しています。しかし、これまでは他のすべての Java AS と同じように動作していたので、これが理由になるとは思いません。独自のエンティティを持たない POST であっても、他のすべての REST 操作は機能します。
追加: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());