簡體   English   中英

如何正確地將特定對象的列表轉換為Gson?

[英]How to properly convert List of specific objects to Gson?

我正在研究Spring MVC項目。 我正在使用Hibernate。 我想使用AJAX和jQuery從我的Spring Controller中獲取一些JSON。 不幸的是,當我在我的應用程序中實現Gson方法時,我遇到了一個錯誤:

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

我必須使用哪種適配器以及使用哪種方式? 該方法的最后一行發生錯誤:

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

這是我在使用Hibernate的Spring MVC項目中使用的Message類:

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

編輯

我想知道:我的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;
}

編輯2

不,我的List<Message>對象未被代理。

我已經解決了我的問題。 關於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;      
    }
}

就這樣。 現在我可以正確使用AJAX在jQuery中獲取JSON。

正如@madhead在評論中提到的那樣,這是因為,根據情況,Hibernate會在您的對象周圍創建代理,這將調用某些方法的實際實現,並為其他方法調用“已檢測”。 因此,對象的“實際”類型是HibernateProxy。 您可以使用類似於此處描述的代碼來訪問您的實現。 在您的情況下,您必須為列表中的每個項目調用“unproxy”方法,將它們放入新列表中。

雖然很難回答,但我想通過為字符串字段創建DTO來解決目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM