我正在从事Spring MVC项目。我正在使用Hibernate。我想将AJAX与jQuery结合使用,以从Spring Controller中获取一些JSON。不幸的是,当我Gson在应用程序中实现方法时,出现了一个错误:
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一起使用的班级:
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>?我通过这种方式获取消息列表:
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对象的假设似乎非常有可能。但是,当我仔细阅读错误后,一切都开始正常工作。最后,我以这种方式注册了类型适配器:
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班级看起来像:
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。