当前位置: 首页 > 面试题库 >

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

阳念
2023-03-14
问题内容

我正在从事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);
}

这是我Message在Spring MVC项目中与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
}

编辑

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



 类似资料:
  • 使用Java 8 Stream包,我想将object类型的数组列表转换为特定类对象的列表。第一个列表上的数组包含从数据库加载的类的字段。 这是从DB加载的object类型数组的列表: 列表中的每个元素都包含我想要映射到以下类的字段: 正如您所看到的,原始列表中存在的每个元素都是对象[]的数组表示 现在,我知道如何使用循环来实现这一点,正如您在下面看到的,只需3行代码: 如何使用Java 8流实现相

  • 问题内容: 我有SourceObjects列表,我需要将其转换为ResultObjects列表。 我可以使用ResultObject的方法将一个对象获取到另一个对象: 我当然可以这样: 但对于能够展示如何使用 rxJava 进行相同操作的人,我将非常感激。 问题答案: 如果发出,则可以使用以下运算符: (将您的列表转换为可观察项) (将您的商品转换为其他商品) 运算符(将完成的Observable

  • 我有以下格式的列表 如何根据其键找到值,例如我需要第3行的名称...以及如何根据行对其进行排序

  • 问题内容: 最近我谈话有什么将要转换的最佳方式是同事,以在Java中,如果有这样做的任何特殊利益。 我想知道最佳转换方法,如果有人可以指导我,我将不胜感激。 这是个好方法吗? 问题答案: 当然,假设每个Item都有一个返回正确类型的键的方法。

  • 我在Eclipse IDE中编写了JavaFx项目,它工作正常。 一旦我把它转换成Maven项目,我的FMXL文件就停止打开了。但是,如果我创建新的FXML文件并将它们放在相同的文件夹中,一切都会正常工作。 有没有办法在不重新创建所有FXML文件的情况下运行我的Maven项目? 我已经尝试过在代码中更改FXML文件的路径,将FXML移到src/main/resources包,或者简单地将代码从旧的

  • 问题内容: Json字符串: C#类: C#将json转换为电影的c#列表: 我的变量最终是一个计数为0的空列表。我是否缺少某些内容? 问题答案: 您的C#类映射与json结构不匹配。 解决方案: