Spring MVC 控制器 Json 响应,休眠代理错误

Spring MVC controller Json response, hibernate proxy error

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

  @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?

它没有 return 任何 Json 表示。 我将方法更改为 return 字符串,例如:

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

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

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

我是不是漏掉了什么?

当 GSON 尝试将变量 'events' 序列化为 Json 时,com.google.gson.internal.bind.TypeAdapters 抛出异常。

发生这种情况,导致

eventService.listAllEvents() 

returns 不是已经包含所有事件的列表,而是休眠代理,它会在实际使用列表时懒惰地执行此操作。 GSON 不知道如何序列化该代理。

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

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

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