次のようなメソッドを持つリソースがあります。
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/add")
public Response putThing(Thing thing) {
try {
//Do something with Thing object
return Response.status(HttpStatus.SC_OK).build();
} catch (Exception e) {
log.error("Request failed", e);
return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
}
}
事:
public class Thing {
private final String symbol;
private final String name;
public Stock(String symbol, String name) {
this.symbol = symbol;
this.name = name;
}
public String getSymbol() {
return this.symbol;
}
public String getName() {
return this.name;
}
}
次のようなPUTリクエストを行うと:
PUT /rest/add HTTP/1.1
Host: localhost:8135
Content-Type: application/json
Cache-Control: no-cache
{"symbol":"some symbol","name":"some name"}
私は次の応答を受け取ります:
型[単純型、クラスシング]に適したコンストラクターが見つかりません:JSONオブジェクトからインスタンス化できません(デフォルトのコンストラクターまたは作成者が見つからないか、型情報を追加/有効にする必要がありますか?)
Jersey/JacksonがJSONオブジェクトをPOJOにデシリアライズしないのはなぜですか?
引数なしのコンストラクターとセッターが必要か、@JsonCreator
を使用します。最も簡単なことは、セッターで引数なしを追加することです。ジャクソンは、デシリアライズするときにセッターを必要とします。シリアル化に必要なのはゲッターだけです。
[〜#〜] edit [〜#〜]
不変に保つには、コンストラクターで@JsonCreator
を使用できます。例えば
@JsonCreator
public Thing(@JsonProperty("symbol") String symbol,
@JsonProperty("name") String name) {
this.symbol = symbol;
this.name = name;
}
私は絶対に前向きではありませんが、これはそれだと思います。
ジャクソンが働きたいのはこれです:デフォルト(引数なし)コンストラクターを使用してオブジェクトを作成します。次に、セッターを使用して各インスタンス変数を設定します。これは長い道のりのように思えるかもしれませんが、ジャクソンはコンストラクターパラメーターを渡す順序を把握するのに十分なほど賢くできないため、本当に唯一の方法です。したがって、コードには2つの主要な問題がありますあなたが投稿のためにほとんど掃除する前に、あなたのクラスはStockと呼ばれたと仮定します;-))。
1。引数なしのコンストラクタが必要です。私が知っていることから、Javaは、作成しない場合はデフォルトのコンストラクタを提供しますが、コンストラクタを作成するとすぐに、引数のないデフォルトのコンストラクタはなくなります。
2。インスタンス変数のセッターが必要です(そして、それらをパブリックにするだけでは十分ではなく、実際のセッターが必要です)。ああ、インスタンス変数は最終的なように見えますが、うまくいきません。すべてのコピー/貼り付けセッターを管理する私のお気に入りの方法は、lombokと呼ばれるライブラリを使用することです。とにかく、今のところはこれらのセッターが必要です。