我的SpringMVC RestController
中存在写入JSON结果的问题:
1)当我返回域对象,如下所示,ActivitiesT 时,我在客户端获得了AJAX 500内部服务器错误。
@RequestMapping("/participant/activityForEvent")
public ActivitiesT getActivityForGuiEventId() throws Exception {
ActivitiesT activitiesT = participantService.getActivity();
return activitiesT;
}
ActivitiesT Domain对象,Hiberate-generated:
@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“)
有些注意事项:
Serializable
,这很好@RestController
进行注释,因此它始终输出JSON;我不需要ResponseBody或旧标签对问题所在的任何想法?问题归结为:
答案 0 :(得分:1)
当Jackson准备响应时,它会递归尝试将模型类转换为JSON。例如,如果您有一对多关系的Department和Employee关系,那么Jackson会在Department.java中执行getEmployees()方法来准备响应。但是getEmployees()方法要求hibernate执行另一个查询,以便在延迟加载时从DB获取员工记录。但会议已经结束。因此,您收到此错误。 为了避免这种情况,请始终使用DTO而不是实际的模型类。您提到的同样的事情 - 从RestController返回的域对象会导致AJAX错误;自定义模型对象有效。