12

Jersey1.11を使用してJavaでRESTfulWebサービスを構築していますが、JSON化されたエンティティのリストを使用するメソッドの実装に問題があります。シングルインスタンスメソッドは正常に機能します。

私が得るエラーは次のとおりです。

Status 400 - Bad Request. The request sent by the client was syntactically incorrect.

私のメソッドシグネチャは次のようになります。

@POST
@Path("/some-path/{someParam}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String createBatch(List<MyEntity> myEnts, @PathParam("someParam") String someParam)
{
   ... 
}

リクエストで送信しているJSONは、MyEntityJSONオブジェクトの配列です。

[{"field1" : value1, "field2" : value2}, {"field1" : value3, "field2" : value4}, ...]

以前にも同様の質問があり、消費されたメディアタイプをテキストに変更し、JSONを手動で逆シリアル化するという簡単な提案がありましたが、よりクリーンなソリューションをお勧めします。

送信しているJSONはこのコンテキストでも有効ですか、それともトップレベル{}、つまりラッパーエンティティが必要ですか?これも少し不自然に思えます。

ありがとうございました、

/デビッド

4

5 に答える 5

7

PathParam と、Jersey(JAX-RS) によってアンマーシャリングされるべき Param は不可能だと思います。PathParam パラメータを削除してみてください。

そして、2 番目のパラメーターが必要な場合は、このような新しいクラスを作成します

@XmlRootElement(name = "example")
public class Example {
  @XmlElement(name = "param")
  private String param;
  @XmlElement(name = "entities")
  private List<MyEntity> entities;
}

Methode も変更します。

@POST
@Path("/some-path")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String createBatch(Example example)
{
   ... 
}

JSON は次のようになります。

{
 "param":"someParam",
 "entities":[
   {"field1" : value1, "field2" : value2}, {"field1" : value3, "field2" : value4}, ...]
}
于 2013-03-24T00:34:35.937 に答える
4

わかりましたので、最終的に、生成するために単純なラッパー クラスを使用してこれを解決しました{ items : [{ <myEnityInstanceJson1> }, { <myEnityInstanceJson2> }, ... ]}ジェネリックラッパーを使用する方法があると思いますが、今のところこれでうまくいきます:

@XmlRootElement
public class MyEntityWrapper implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<MyEntity> items;

    public MyEntityWrapper() {
        this.items = new ArrayList<MyEntity>();
    }

    public MyEntityWrapper(List<MyEntity> items) {
        this.items = items;
    }

    public List<MyEntity> getItems() {
        return items;
    }

    public void setItems(List<MyEntity> items) {
        this.items = items;
    }
}
于 2013-04-02T22:44:54.147 に答える
2

問題は、タイプ消去のために実行時に使用できないジェネリック リスト タイプであるため、Jersey は非整列化する POJO の種類を認識しません。

この場合の最も簡単な解決策 (少なくとも Jackson で Jackson を使用するMessageBodyReader場合は機能することがわかっています) は、List の代わりに通常の Java 配列を使用することなので、メソッドのシグネチャは次のようになります。

public String createBatch(@PathParam("someParam") String someParam, MyEntity[] myEnts)

はい、組み合わせ@PathParamて、消費/非マーシャリングされた本体パラメーターは問題ないはずです。

于 2016-06-29T15:40:31.823 に答える
0

これは、配列の有効な JSON です。

{"elements": [
        {"field1" : value1, "field2" : value2}, 
        {"field1" : value3, "field2" : value4},
        ...]
};

(例はこちらをご覧ください)

テキストを送信する必要はありません。JSON として送信できます。また、あなたはそれMyEntityを持っ@XmlRootElementている必要があります(例については、ここを参照してください、セクション5.2)。

PathParam引数には必要ありません。メソッド シグネチャにsomeParamを残しておくと、リクエストがポストされたときに利用できます。@Path("/some-path/{someParam}")

于 2013-03-24T00:39:56.747 に答える