java - HTTP 状态 500 - 未能延迟初始化角色 : . 的集合 ..,无法初始化代理 - 无 session

标签 java json spring hibernate

我尝试从 spring Controller 将客户列表查询为 json。当我访问 url 时,我可以得到没有错误的列表。

-客户 Controller

@RequestMapping("getCustomerListRB")
public @ResponseBody List<Customer> getCustomerListsRB() {
    List<Customer> cusList = new ArrayList<Customer>();
    cusList = cusService.getList();
    return cusList;
}

但是当我尝试在客户模型中加入表格时 -客户.java

   @OneToMany(mappedBy = "Customer", cascade = CascadeType.ALL)
    private List<MainOrder> MainOrder;

    public List<MainOrder> getMainOrder() {
        return MainOrder;
    }
    public void setMainOrder(List<MainOrder> mainOrder) {
        MainOrder = mainOrder;
    }

再次运行服务器出现如下错误:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: com.mdr.model.Customer.mainOrders, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.mdr.model.Customer["mainOrders"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.mdr.model.Customer.mainOrders, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.mdr.model.Customer["mainOrders"])
    org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:256)
    org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:143)
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:89)
    org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:193)
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

在我添加 fetch = FetchType.EAGER 后,如下所示

@OneToMany(mappedBy = "Customer", cascade = CascadeType.ALL,fetch = FetchType.EAGER) 

我再次运行服务器它没有错误但无法获取数据。请帮助我!

最佳答案

首先,您需要一个持续时间足够长的事务,以便 Session 可用于延迟获取相关实体。在您的示例中,您返回的实体列表在事务范围之外具有未获取的相关实体(Spring 内部结构将在事务结束后将 List 转换为 JSON - 这就是它失败的原因)。

您可以执行以下操作之一:

  1. 跳过关系中的惰性,因为无论如何都必须获取所有相关实体以准备完整的 JSON 响应。
  2. 将您的方法修改为:“String getCustomerListsRB()”并使用 ObjectMapper 自行将“List”序列化为 JSON(您可以将 ObjectMapper 自动连接到您的 Controller )。
  3. 尝试使用 Open Session In View 过滤器,但我强烈建议您不要使用这种方法,因为它会影响性能,因为数据库连接保持的时间超过了必要的时间。

关于java - HTTP 状态 500 - 未能延迟初始化角色 : . 的集合 ..,无法初始化代理 - 无 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304234/

相关文章:

Java 8 按多个字段分组到单个映射中

包含美元分隔变量的 Java 属性

java - CXF中相同的服务和端口名称如何处理?

java - 如何使用 spring 5 响应式(Reactive)存储库以“即发即忘”模式进行保存

spring - java.lang.NoClassDefFoundError : org/apache/commons/pool2/PooledObjectFactory

java - jpa mysql 表不存在 autoGenerate 不起作用

php - 循环数组没有给出所需的结果

javascript - 在 POST 上将 javascript 对象读取为 JSON

java - 预期 BEGIN_ARRAY 但在第 1 行第 1 列路径 $ GSON 处为 STRING

java - 使用不同的构造函数参数并使用 Autowiring 创建同一类的 2 个 bean