Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RestController返回的域对象导致AJAX错误;自定义模型对象工作_Ajax_Spring_Spring Mvc_Spring Restcontroller - Fatal编程技术网

RestController返回的域对象导致AJAX错误;自定义模型对象工作

RestController返回的域对象导致AJAX错误;自定义模型对象工作,ajax,spring,spring-mvc,spring-restcontroller,Ajax,Spring,Spring Mvc,Spring Restcontroller,我的SpringMVCRestController中有一个写入JSON结果的问题: 1) 当我返回如下所示的域对象时,activitiestt,我在客户端收到一个AJAX 500内部服务器错误 @RequestMapping("/participant/activityForEvent") public ActivitiesT getActivityForGuiEventId() throws Exception { ActivitiesT activitiesT = particip

我的SpringMVC
RestController
中有一个写入JSON结果的问题:

1) 当我返回如下所示的域对象时,activitiestt,我在客户端收到一个AJAX 500内部服务器错误

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception {
    ActivitiesT activitiesT = participantService.getActivity();
    return activitiesT;
}
最活跃的域对象,Hibrate生成:

@Entity
@Table(name = "activities_t", schema = "public")
public class ActivitiesT implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private int id;
    //... etc...
}
2) 但是,当我返回一个自定义POJO时,AJAX方法就起作用了。几乎一样

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception {
    ActivitiesT activitiesT = participantService.getActivity();
    // Create a custom Activity POJO and return it
    return new Activity(activitiesT.id, activitiesT.title);
}
活动自定义POJO:

public class Activity implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public int id;
    public String title;
     //etc.
错误消息

HTTP Status 500 - Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - 
无会话(通过引用链:com.myapp)

需要注意的一些事项:

  • 这两个对象都实现了可序列化,这很好
  • 问题不是DAO,我可以看到DAO总是返回正确的数据,我们可以忽略DAO片段
  • 控制器用
    @RestController
    注释,因此它总是输出JSON;我不需要ResponseBook或旧的标记
有没有想过问题可能在哪里?问题归结为:

  • 我无法从Hibernate生成的@Entity POJO上的RestController方法返回JSON
  • 但我可以在自己的自定义POJO上从RestController方法返回JSON

当Jackson准备响应时,它会递归地尝试将模型类转换为JSON。例如,如果您拥有一对多关系的部门和员工关系,则Jackson会执行Department.java中的getEmployees()方法来准备响应。但是getEmployees()是由于延迟加载,方法要求hibernate执行另一个查询以从数据库中获取员工记录。但会话已关闭。因此,您会遇到此错误。
为了避免这种情况,请始终使用DTO而不是实际的模型类。正如您所提到的-从RestController返回的域对象会导致AJAX错误;自定义模型对象会工作。

您能否提供引发的异常(
500内部服务器错误
)?服务器端没有抛出异常,控制器完成正常。当我在客户端访问AJAX JS时,我只在Firebug中看到500个内部服务器错误。500个内部服务器错误表示服务器端正在发生某些事情。我见过这种问题,在大型对象的序列化中,
ActivitiesT
很简单或者复杂对象(只是猜测)在控制器返回值后引发某种异常。我现在得到错误消息,它是:
HTTP状态500-无法写入JSON:无法初始化代理-无会话;嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法初始化代理-无会话(通过引用链:com.myapp)是的,我相信这就是问题所在。:)幸运的是,我们现在对所有JSON返回方法都使用普通POJO。谢谢