2

次のような Message クラスがあります。

class Message {
   @JsonProperty("content")
   Object content;
}

content 属性は a User、 a Post、または aString であり、このオブジェクトをサーバーに送信し、コンテンツを適切なクラスにキャストする必要があります。

Jackson アノテーションを使用して JSON をシリアライズしていますが、コンテンツをキャストしようとすると、属性コンテンツがLinkedHashMapオブジェクトのようにサーバーに到着するため、エラーが表示されます。

エラーは次のとおりです。

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/MegaRadarSocial].[Resteasy]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to br.com.megaradar.megaradarsocial.model.User

キャスティングを手伝ってほしい...ありがとう

4

3 に答える 3

0

必要なのは@JsonTypeInfo、次のような注釈です。

class Message {
 @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY property="type")
 @JsonProperty("content")
 Object content;
}

(例については、 http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.htmlを参照してください)

これは、シリアル化するときにクラス名を値として持つプロパティ「type」を追加し(他にも多くの方法があります)、逆シリアル化するときにそれを使用します。

于 2012-11-14T01:13:05.253 に答える
0

両端 (サーバーとクライアント) を制御するので、Genson ライブラリhttp://code.google.com/p/genson/を試すことができます。その機能の 1 つを使用すると、json と型情報にシリアル化できます。これにより、正しい型に逆シリアル化できます。

Genson genson = new Genson.Builder().setWithClassMetadata(true).create();
json = genson.serialize(yourMessage);

// then deserialize it back
Message message = genson.deserialize(json, Message .class);

シリアル化された json は次のようになります: {"content": {"@class":"package.path.Message", ...オブジェクトの値...}}

シリアル化されたクラスのエイリアスを定義することもできます

new Genson.Builder().addAlias("message", Message.class)

重要: 両方の側で genson の同じ構成を使用する必要があることに注意してください。そのため、setWithClassMetadata で型情報を有効にし、エイリアスを使用する場合は、クライアント側で同じものを定義する必要があります。

于 2012-11-13T16:14:41.637 に答える
0

すべての回答に感謝します。しかし、オブジェクトを必要な型に変換する別の方法を見つけました。オブジェクトのメソッドを使用してconvertValueObjectMapperます。次に、キャスティングをシミュレートします。

再度、感謝します

于 2012-12-10T13:25:46.727 に答える