Spring mvc 避免在SpringMVC中序列化Mybatis lazyload对象
我有一个RESTful项目,它是由SpringMVC框架和Mybatis ORM构建的 有两个表,Book和Author,有一对多的关系。 我启用了延迟加载,所以当我查询Book时,它不会查询Author,除非我调用Book.getAuthor()方法,而且一切正常 mybatis-config.xml:启用延迟加载 BookMapper.xml 然而,当RESTful控制器返回Book对象时,它使用Jackson将Book对象传输到json,并触发mybatis加载Author对象 控制器:在第30行,它只查询图书 在第31行之后,它还查询AuthorSpring mvc 避免在SpringMVC中序列化Mybatis lazyload对象,spring-mvc,jackson,lazy-loading,mybatis,Spring Mvc,Jackson,Lazy Loading,Mybatis,我有一个RESTful项目,它是由SpringMVC框架和Mybatis ORM构建的 有两个表,Book和Author,有一对多的关系。 我启用了延迟加载,所以当我查询Book时,它不会查询Author,除非我调用Book.getAuthor()方法,而且一切正常 mybatis-config.xml:启用延迟加载 BookMapper.xml 然而,当RESTful控制器返回Book对象时,它使用Jackson将Book对象传输到json,并触发mybatis加载Author对象 控制
当RESTful控制器返回json时,有没有办法防止mybatis触发延迟加载 问题不在mybatis。问题在于序列化。如果查询属性,mybatis别无选择,只能加载属性 解决方案是配置序列化,以便不序列化
作者
属性
例如,可以使用以下方法完成此操作:
首先,创建指定其他配置的混合:
abstract class NoAuthorsMixIn {
@JsonIgnore abstract List<Author> authors();
}
请注意,这将在所有控制器方法中禁用
作者
的序列化。如果您需要能够根据控制器和/或控制器方法进行切换,则设置会更复杂(例如,请查看)我找到了一个解决方案,虽然不是最好的,但它很有效。仍然期待更好的解决方案
当Jackson序列化Book对象时,它触发Book.getAuthors(),Mybatis检测到调用Book.getAuthors(),因此Mybatis通过Javassist代理执行延迟加载,如下所示:
请注意,“任何调用getter的人都将触发延迟加载”(红色圆圈),这就是为什么Jackson总是在序列化中触发延迟加载的原因
为了解决这个问题,我修改了Bookbean:
@JsonIgnore
,以防止Jackson调用getAuthors()@JsonGetter(value=“authors”)
,以便Jackson可以序列化作者,而不会触发延迟加载谢谢您的回复。实际上,在我的例子中,只要用户想要获取作者数据,就可以调用Book.getAuthors(),因此此配置可能不适合我的情况,因为它禁用了所有作者的序列化。
@Configuration
public class JacksonConfiguration {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Book.class, NoAuthorsMixIn.class);
return mapper;
}
}