如何将特定对象列表正确转换为Gson?

2022-09-03 01:01:37

我正在从事春季MVC项目。我正在使用休眠。我想将AJAX与jQuery一起使用,从我的Spring Controllers中获取一些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
}

编辑

我想知道:我的对象是代理还是整个?我以这种方式获取消息列表:MessageList<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>


答案 1

我已经解决了我的问题。关于物体的假设似乎非常有可能。但是,当我仔细阅读我的错误时,一切都开始正常工作。最后,我以这种方式注册了类型适配器: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。


答案 2

正如注释中提到的@madhead,发生这种情况是因为,根据情况,Hibernate会围绕您的对象创建代理,这些代理将调用某些方法的实际实现,而对于其他方法,将调用“检测”的代理。因此,对象的“实际”类型是HibernateProxy。您可以通过使用类似于此处所述的代码来访问您的实现。在你的情况下,你必须为列表中的每个项目调用“unproxy”方法,将它们放入一个新列表中。