从 RestController 返回的域对象导致 AJAX 错误;自定义模型对象工作
Domain Object Returned from RestController causes AJAX error; Custom Model Object works
我的 SpringMVC RestController
中有一个问题写入 JSON 结果:
1) 当我 return 如下所示的 域对象 ActivitiesT 时,我在客户端收到 AJAX 500 内部服务器错误。
@RequestMapping("/participant/activityForEvent")
public ActivitiesT getActivityForGuiEventId() throws Exception {
ActivitiesT activitiesT = participantService.getActivity();
return activitiesT;
}
ActivitiesT 域对象,Hiberate 生成:
@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) 但是当我 return 一个 自定义 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);
}
Activity 自定义 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
,没关系
- 问题不在于 DAO,我可以看到 DAO 总是 return 两者的正确数据,我们可以忽略 DAO 部分
- Controller注解为
@RestController
,所以总是输出JSON;我不需要 ResponseBody 或旧标签
对问题可能出在哪里有任何想法吗?问题归结为:
- 我不能 return JSON 来自 Hibernate 生成的 @Entity POJO 上的 RestController 方法,
- 但我可以 return JSON 从我自己的自定义 POJO 上的 RestController 方法
当 Jackson 准备响应时,它会递归地尝试将模型 类 转换为 JSON.For 示例,如果您的部门和员工之间存在一对多关系,那么 Jackson 会在 Department.java 准备 response.But getEmployees() 方法需要 hibernate 执行另一个查询以从数据库中获取员工记录,因为延迟加载。但是 session 已经关闭了。因此你得到这个错误。
为避免这种情况,请始终使用 DTO 而不是实际模型 classes.And 与您提到的相同 - 从 RestController 返回的域 Object 会导致 AJAX 错误;自定义模型 Object 有效。
我的 SpringMVC RestController
中有一个问题写入 JSON 结果:
1) 当我 return 如下所示的 域对象 ActivitiesT 时,我在客户端收到 AJAX 500 内部服务器错误。
@RequestMapping("/participant/activityForEvent")
public ActivitiesT getActivityForGuiEventId() throws Exception {
ActivitiesT activitiesT = participantService.getActivity();
return activitiesT;
}
ActivitiesT 域对象,Hiberate 生成:
@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) 但是当我 return 一个 自定义 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);
}
Activity 自定义 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
,没关系 - 问题不在于 DAO,我可以看到 DAO 总是 return 两者的正确数据,我们可以忽略 DAO 部分
- Controller注解为
@RestController
,所以总是输出JSON;我不需要 ResponseBody 或旧标签
对问题可能出在哪里有任何想法吗?问题归结为:
- 我不能 return JSON 来自 Hibernate 生成的 @Entity POJO 上的 RestController 方法,
- 但我可以 return JSON 从我自己的自定义 POJO 上的 RestController 方法
当 Jackson 准备响应时,它会递归地尝试将模型 类 转换为 JSON.For 示例,如果您的部门和员工之间存在一对多关系,那么 Jackson 会在 Department.java 准备 response.But getEmployees() 方法需要 hibernate 执行另一个查询以从数据库中获取员工记录,因为延迟加载。但是 session 已经关闭了。因此你得到这个错误。 为避免这种情况,请始终使用 DTO 而不是实际模型 classes.And 与您提到的相同 - 从 RestController 返回的域 Object 会导致 AJAX 错误;自定义模型 Object 有效。