2011-02-04 13 views
2

JAXBクラスにJsonTypeInfoで注釈を付けて、多態性クラスを簡単にシリアル化できるようにしました。ただし、Jerseyによってシリアル化されたときに注釈は表示されません。具体的には、ObjectMapperを使用すると表示されますが、リソースの戻り値の型としては表示されません。ジャージー=>ジャクソンの相互作用に問題があるように思われるので、私は今非常に混乱しています。ジャージーでジャクソンを使用しているときにJsonTypeInfoがシリアライズしない

デバッグするには、ジャージサンプルのjsonfromjaxbサンプルを使用して問題をローカライズしました。私はFlightクラスに以下を追加して@classにシリアライズしました。

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") 

Iリソースで利用可能な以下の方法だけでJAXBオブジェクトを返す一方と手動クエリ/ jsonfromjaxb /便の

@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); 
} 

結果ObjectMapperを使用するものを持っている

{"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"}]} 

おかげで、 身代金

答えて

0

私は、ObjectMapperを使用するものです(あなたはジャクソン・ベースのシリアル化を使用していないように見えると思います。低レベルのjacksonジェネレータは、バインディングが異なる方法を含め、ほとんどのJSON出力に使用されます)。あなたがそうだったなら、明示的な使用から見るもののように見えるはずです。だから、JerseyのJSON設定を変更することになります。

+0

ありがとうございました。私は、デバッガを使用して、ジャクソンのライブラリにアクセスしていることを確認しました。そして、低レベルのものを使用していてJAXBのものを使用していなかったことを指摘してくれました。ソリューションの残りの部分には次のものが追加されました。 –

+1

​​com.sun.jersey.api.json.POJOMappingFeature

+0

[OK]を偉大な - 私はこれを覚えておく必要があります。私はこれがいくつかのメーリングリスト(ジャージーユーザー)のよくある質問だと思う – StaxMan

関連する問題