如何正确转换特定对象列表为Gson? [英] How to properly convert List of specific objects to Gson?

查看:99
本文介绍了如何正确转换特定对象列表为Gson?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发Spring MVC项目。我正在使用Hibernate。我想使用AJAX与jQuery从我的Spring控制器中获取一些JSON。不幸的是,当我在应用程序中执行 Gson 方法时,出现错误:

  java.lang.UnsupportedOperationException:试图序列化java.lang.Class:
org.hibernate.proxy.HibernateProxy。忘记注册一个类型适配器?

我必须使用哪种适配器以及以哪种方式使用?错误发生在方法的最后一行:

  public String messagesToJson(List< Message> messages){
Gson gson = new Gson();
列表<消息> synchronizedMessages = Collections.synchronizedList(messages);
返回gson.toJson(synchronizedMessages,ArrayList.class);

这是我的消息 class我在Spring MVC项目中使用Hibernate:

  @Entity 
@Table(name =MESSAGES ,schema =PUBLIC,catalog =PUBLIC)
公共类Message实现java.io.Serializable {

private static final long serialVersionUID = 1L;
private int messageId;
私人用户用户;
私人字符串消息;
私人日期日期;

//构造函数,getters,setters,toString
}

编辑



我想知道:我的 Message code>列表与LT;消息> ?我以这种方式得到消息列表:

  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();
返回消息;
}

编辑2



不,我的< code> List< Message> 对象没有被代理

解决方案

我解决了我的问题。关于 HibernateProxy 对象的假设似乎很可能。但是,当我仔细阅读我的错误时,一切都已开始正常工作。最后我以这种方式注册了类型适配器:

  public String messagesToJson(List< Message> messages){
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.registerTypeAdapter(Message.class,new MessageAdapter())。create();
返回gson.toJson(消息);

任何我的 MessageAdapter 类看起来像:

  public class MessageAdapter实现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());
返回jsonObject;
}
}

这就是全部。现在我可以正确使用AJAX在jQuery中获取JSON。


I am working on Spring MVC project. I am using Hibernate. I want to use AJAX with jQuery to get some JSONs from my Spring Controllers. Unfortunately when I was implementing Gson methods in my application I have got an error:

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

Which adapter I have to use and in which way? The error has occurred on the last line of the method:

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

This is my Message class I am using in my Spring MVC project with Hibernate:

@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 am wondering: my Message object is proxied or the whole List<Message>? I am getting the list of messages in this way:

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

No, my List<Message> object isn't proxied.

解决方案

I have resolved my problem. The assumption about HibernateProxy objects seemed to be very probable. However everything has started to work properly when I have read carefully my error. Finally I have registered type adapter in this way:

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

Any my MessageAdapter class looks like:

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

And thats all. Now I can get JSONs in jQuery using AJAX properly.

这篇关于如何正确转换特定对象列表为Gson?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆