【问题标题】:Spring MVC controller Json response, hibernate proxy errorSpring MVC控制器Json响应,休眠代理错误
【发布时间】:2017-05-03 05:39:57
【问题描述】:

我有一个 Spring 控制器注释类,它实现了这个方法:

  @RequestMapping(value = "/event/eventList", method = RequestMethod.GET)
    public @ResponseBody List<Event> listEvents() {
        System.out.println("############ LIST EVENTS ############");
        List<Event> events = eventService.listAllEvents();
        for(Event event : events) {
            Hibernate.getClass(event);
            System.out.println(event);
        }
        return events;
    }

当我从浏览器调用页面 (localhost:8080/myapp/event/eventList) 时,该方法将被正确调用我看到所有日志并且事件被正确打印意味着事件列表不是空且有效的,但是我得到了错误:

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/myapp] threw exception [Request processing failed; nested exception is java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?] with root cause
java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?

它不返回任何 Json 表示。 我更改了返回字符串的方法,例如:

@RequestMapping(value = "/event/eventList", method = RequestMethod.GET)
public @ResponseBody String listEvents() {

    return "{'pippo':1}";
}

在这种情况下,浏览器会正确显示字符串。

我错过了什么吗?

【问题讨论】:

  • 它告诉你,它不能序列化 HibernateProxy。 Hibernate.getClass 不会让代理对象神奇地消失。您需要“解压”它,.getHibernateLazyInitializer().getImplementation() 之类的东西可以做到,或者只是修复您的架构并且不提供控制器实体而是 DTO。

标签: json spring hibernate spring-mvc getjson


【解决方案1】:

当 GSON 尝试将变量“事件”序列化为 Json 时,com.google.gson.internal.bind.TypeAdapters 会引发异常。

发生这种情况,原因

eventService.listAllEvents() 

返回的不是已经包含所有事件的列表,而是在实际使用列表时会延迟执行的休眠代理。 GSON 不知道如何序列化该代理。

Hibernate.getClass 应该初始化底层对象作为副作用。

您还需要为列表“事件”本身调用它,而不仅仅是每个事件。 List 也可以是休眠代理。

您可以在以下位置找到有关该主题的更多信息 Could not serialize object cause of HibernateProxy

【讨论】:

  • 感谢 Stefan,我的解决方案是在 Event 中的每个类变量上添加 Annotation @JsonIgnore,表示外部关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多