2

ポリモーフィックなクラスを簡単にシリアル化できるように、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"}]}

ありがとう、身代金

4

1 に答える 1

0

Jackson ベースのシリアライゼーション (つまり、ObjectMapper を使用するシリアライゼーション) を使用していないように見えると思います。低レベルの jackson ジェネレーターは、バインディングが異なる方法で行われるものを含め、ほとんどの JSON 出力に使用されます)。もしそうなら、明示的な使用から見たもののように見えるはずです。したがって、Jersey JSON 構成を変更することが問題のようです。

于 2011-02-05T06:17:49.553 に答える