【发布时间】:2012-07-16 02:44:32
【问题描述】:
我正在开发 Spring MVC 项目。我正在使用休眠。我想使用 AJAX 和 jQuery 从我的 Spring 控制器中获取一些 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> 对象没有被代理。
【问题讨论】:
-
这可能是因为 hibernate 为您的对象创建了代理。因此参数
List<Message> messages无法处理该代理。正如您从堆栈跟踪中看到的那样,您正在尝试序列化org.hibernate.proxy.HibernateProxy。也许您可以在运行时将cglib与字节码操作一起使用以避免创建代理。 -
您应该将 Hibernate 对象映射到常规对象。
-
我必须简单地创建类似于 Hibernate 对象但没有注释的 POJO 类? @madhead 但是在我看来使用
cglib有点过头了。 -
仅供参考,如果
List<Message>被代理,则它不是HibernateProxy的实例,而是PersistentCollection的实例。当心你正在测试的东西;)