2012-07-17 5 views
16

私はSpring MVCプロジェクトに取り組んでいます。私は休止状態を使用しています。 Spring ControllerからJSONを取得するために、jQueryでAJAXを使用したいと思います。アダプター私が使用してどのようにする必要が特定のオブジェクトのリストをGsonに正しく変換するには?

java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: 
org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter? 

:私は自分のアプリケーションでGsonメソッドを実装しました残念ながら、ときに私はエラーを持っていますか?

@Entity 
@Table(name = "MESSAGES", schema = "PUBLIC", catalog = "PUBLIC") 
public class Message implements java.io.Serializable { 

    private static final long serialVersionUID = 1L; 
    private int messageId; 
    private User users; 
    private String message; 
    private Date date; 

    //Constructor, getters, setters, toString 
} 

EDIT

I:これは私が休止状態で私のSpring MVCのプロジェクトで使用しています私のMessageクラスは

public String messagesToJson(List<Message> messages) { 
    Gson gson = new Gson();  
    List<Message> synchronizedMessages = Collections.synchronizedList(messages); 
    return gson.toJson(synchronizedMessages, ArrayList.class); 
} 

です:エラーはメソッドの最後の行で発生しました不思議です:私のMessageオブジェクトがプロキシされているか、全体がList<Message>ですか?私は、このようにメッセージのリストを取得しています:

public List<Message> findAllUserMessages(String username) { 
    Query query = entityManager.createQuery("from Message where username = :username order by date desc") 
      .setParameter("username", username); 

    @SuppressWarnings("unchecked") 
    List<Message> messages = query.getResultList(); 
    return messages; 
} 

EDIT 2

いいえ、私のList<Message>オブジェクトがプロキシされていません。

+1

これはおそらく、hibernateがあなたのオブジェクトの代理を作成するためです。したがって、パラメータ 'List messages'はそのプロキシを処理できません。スタックトレースから見ると、 'org.hibernate.proxy.HibernateProxy'をシリアル化しようとしています。おそらく、実行時に 'cglib'をバイトコードの操作で使用して、プロキシを作成しないようにすることができます。 – madhead

+0

Hibernateオブジェクトを通常のオブジェクトにマッピングする必要があります。 – Tomer

+0

私は単にHibernateオブジェクトに似たPOJOクラスを作成する必要がありますが、注釈は必要ありません。 @madheadしかし、 'cglib'を使うと、私は過度のことに思えます。 – woyaru

答えて

25

私は私の問題を解決しました。 HibernateProxyオブジェクトに関する仮定は非常に可能性が高いようでした。しかし、慎重に私のエラーを読んだとき、すべてが正しく動作するようになりました。最後に、私は、このようにタイプのアダプタを登録している:

public String messagesToJson(List<Message> messages) { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    Gson gson = gsonBuilder.registerTypeAdapter(Message.class, new MessageAdapter()).create(); 
    return gson.toJson(messages); 
} 

どれでも私のMessageAdapterクラスには、次のようになります。

public class MessageAdapter implements JsonSerializer<Message> { 

    @Override 
    public JsonElement serialize(Message message, Type type, JsonSerializationContext jsc) { 
     JsonObject jsonObject = new JsonObject(); 
     jsonObject.addProperty("message_id", message.getMessageId()); 
     jsonObject.addProperty("message", message.getMessage()); 
     jsonObject.addProperty("user", message.getUsers().getUsername()); 
     jsonObject.addProperty("date", message.getDate().toString()); 
     return jsonObject;  
    } 
} 

そして、すべてのthats。今、AJAXを使用してjQueryでJSONを正しく取得できます。

+0

ありがとうwoyaru ..私は似たような問題を抱えていましたが、カスタムJsonSerializerを作成することでその問題を解決しました。 :) – FireAndIce

2

コメントに記載されているように、状況によっては、Hibernateがあなたのオブジェクトの周囲にプロキシを作成します。これはいくつかのメソッドの実際の実装を呼び出すものであり、他のもののためのものです。したがって、あなたのオブジェクトの "実際の"タイプはHibernateProxyです。 hereと同様のコードを使用して実装にアクセスできます。あなたのケースでは、リスト内の各項目に対して「非プロンプト」メソッドを呼び出して、それらを新しいリストに入れる必要があります。

+0

残念ながら私はまだ同じエラーがあります。私はあなたが私に提案したような私のプロジェクト 'unproxy'メソッドで実装しました。 – woyaru

+0

私は自分のオブジェクトが 'HibernateProxy'のインスタンスではないことに気付きました。だから、私の場合、 'unproxy'メソッドは何もしません。私は、この条件で 'if(entity!= null && entity instanceof HibernateProxy)'という結果がfalseであることを意味します。 – woyaru

0

答えが古くても、MessageフィールドのDTOを作成するだけで目的を解決できます。

関連する問題