2

私は次のPOJOを持っています:

public class Reservation {
    private String name;
    private BigDecimal price;
    private ArrayList<HashMap<String, Object>> products;
    ...getters & setters for all fields....
}

そして、この単純な Java Jersey REST リソース:

@POST
@Consumes({MediaType.APPLICATION_JSON})
public String insert(Reservation re) {
    //do something here with ReservationEntity   
}

次のデータを使用して POST リクエストを実行すると:

{
  "name":"michal",
  "price":1234.3,
  "products":[
    {"id":1, "desc":"qwerty"},
    {"id":2, "desc":"ytrewq"}
  ]
}

JSONデータから製品のリストを含む予約クラスのオブジェクトを取得することを期待しています。ただし、名前と価格が設定されているだけのオブジェクトが得られます。ArrayList 製品は空です。

org.codehaus.jackson.map.ObjectMapper を使用して、次のように JSON データを逆シリアル化しようとしました。

String data = "{\"name\":\"micha\".....}";
ObjectMapper om = new ObjectMapper();
Reservation re = om.readValue(data, Reservation.class);

この後、オブジェクトは予想どおり ArrayList プロダクトに 2 つのエントリ (HashMaps) を持っていました。オブジェクトマッパーをこのように使用するのは好きではないので、Jersey だけでそれを行う方法を尋ねています。この問題に関する多くの記事を読みましたが、そのほとんどは次のように web.xml に入れることをお勧めします。

<init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>org.foobar.rest.services;org.codehaus.jackson.jaxrs</param-value>    
</init-param>

これも私にはうまくいきませんでした。web.xml に宣言すらありません

私が使用している: - Glassfish 4.0 - Jersey 2.2

編集: GitHub で非常に単純なプロジェクトでリポジトリを作成しました: Jersey22 MyResource クラスには、パスを持つ 2 つの POST メソッドがあります: /working と /notworking

実用的な例をいただければ幸いです。ありがとうございました。

4

3 に答える 3

0

私は私の古いアプリであなたのコードを正確に試しましたが、問題に直面していません.オブジェクト全体が問題なく逆シリアル化されています:

@POST
@Consumes( { MediaType.APPLICATION_JSON } )
public void getServices(Reservation reservation) {
    System.out.println(reservation.getName());
    System.out.println(reservation.getPrice());
    ArrayList<HashMap<String, Object>> products = reservation.getProducts();
    for(HashMap<String, Object> product : products) {
        System.out.println("Product:");
        for(Entry<String, Object> e : product.entrySet()) {
        System.out.println(e.getKey() + " - " + e.getValue().toString());               
        }
    }
}

結果:

michal
1234.3
Product:
id - 1
desc - qwerty
Product:
id - 2
desc - ytrewq

だから私は何がうまくいかないのか理解できません。私のアプリでは、Jersey 1.10 と Jackson 1.8.3 を使用しましたが、Jersey と Jackson のすべてのバージョンで問題ないと思います。

問題を解決する可能性のある改善を提案できる場合は、「製品」を定義する新しいオブジェクトを作成します。概念的には、オブジェクトを表します。おそらく、単純なList<Product>ものは問題なく逆シリアル化されるでしょう。

于 2013-09-17T00:18:09.173 に答える
0

最後に、これを機能させました。重要なステップは次のとおりだと思います。

  • jersey-media-json-jackson maven 依存関係を追加
  • register(JacksonFeature.class); を呼び出して、JAX-RS アプリケーションの作成中に Jackson を登録します。
于 2013-09-25T09:17:11.240 に答える
0

確かにそれはうまくいくはずです...

Gensonライブラリを試して、それをクラスパスに追加することもできます。他の構成なしで動作するはずです。

于 2013-09-17T07:16:07.980 に答える