【发布时间】:2014-03-09 14:55:37
【问题描述】:
我有一个简单的控制器,它返回一个用户对象,这个用户有一个属性坐标,它具有休眠属性 FetchType.LAZY。
当我尝试获取这个用户时,总是要加载所有坐标才能获取用户对象,否则当Jackson尝试序列化用户时会抛出异常:
com.fasterxml.jackson.databind.JsonMappingException: 无法初始化代理 - 没有会话
这是由于 Jackson 试图获取这个未获取的对象。以下是对象:
public class User{
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
@JsonManagedReference("user-coordinate")
private List<Coordinate> coordinates;
}
public class Coordinate {
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
@JsonBackReference("user-coordinate")
private User user;
}
还有控制器:
@RequestMapping(value = "/user/{username}", method=RequestMethod.GET)
public @ResponseBody User getUser(@PathVariable String username) {
User user = userService.getUser(username);
return user;
}
有办法告诉杰克逊不要序列化未获取的对象吗?我一直在寻找 3 年前发布的实施 jackson-hibernate-module 的其他答案。但也许可以通过新的杰克逊功能来实现。
我的版本是:
- 春季 3.2.5
- 休眠 4.1.7
- 杰克逊 2.2
提前致谢。
【问题讨论】:
-
谢谢indybee,我一直在看教程,spring 3.2.5已经有一个MappingJackson2HttpMessageConverter,但是我不能用它来避免非获取的惰性对象,我也尝试过实现教程中的一个,但什么都没有……
-
您是否收到相同的错误“无法初始化代理”或其他错误? (我在 Spring 3.2.6 和 Hibernate 4.1.7 和 jackson 2.3 的文章中使用了额外的 HibernateAwareObjectMapper)
-
知道了!!由于版本 3.1.2 Spring 有他自己的 MappingJackson2HttpMessageConverter 并且具有与教程中的几乎相同的行为,但问题是我使用的是 Spring java config 并且我从 javaconfigs 开始。我试图制作一个 @Bean MappingJackson2HttpMessageConverter,而不是将其添加到 Spring 的 HttpMessageConverters 中,也许答案更清楚:)
-
很高兴它正在工作:)
标签: java spring hibernate serialization jackson