ポリモーフィックなクラスを簡単にシリアル化できるように、JsonTypeInfo で JAXB クラスにアノテーションを付けました。ただし、Jersey でシリアライズすると、アノテーションは表示されません。具体的には、ObjectMapper を使用すると表示されますが、リソースからの戻り値の型としては表示されません。これは Jersey => Jackson の相互作用の問題のように思われるため、現在非常に混乱しています。
物事をデバッグするために、jersey-samples の jsonfromjaxb の例を使用して問題を特定しました。以下を Flight クラスに追加して、@class にシリアル化します。
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
リソースで使用できる次のメソッドがあります。1 つは JAXB オブジェクトを返すだけで、もう 1 つは手動で ObjectMapper を使用します。
@GET
@Produces({"application/json"})
public synchronized Flights getFlightList() {
return myFlights;
}
@GET
@Path("/object_mapper")
@Produces({"application/json"})
public synchronized String getFlights() throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(myFlights);
}
/jsonfromjaxb/flights をクエリした結果
{"flight":[{"flightId":"OK123","company":"Czech Airlines","number":123,"aircraft":"B737"},{"flightId":"OK124","company":"Czech Airlines","number":124,"aircraft":"AB115"}]}
/jsonfromjaxb/flights/object_mapper をクエリした結果
{"@class":"com.sun.jersey.samples.jsonfromjaxb.jaxb.Flights","flight":[{"number":123,"company":"Czech Airlines","aircraft":"B737","flightId":"OK123"},{"number":124,"company":"Czech Airlines","aircraft":"AB115","flightId":"OK124"}]}
ありがとう、身代金