Spring mvc 避免在SpringMVC中序列化Mybatis lazyload对象

Spring 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项目,它是由SpringMVC框架和Mybatis ORM构建的

有两个表,Book和Author,有一对多的关系。

我启用了延迟加载,所以当我查询Book时,它不会查询Author,除非我调用Book.getAuthor()方法,而且一切正常

mybatis-config.xml:启用延迟加载

BookMapper.xml

然而,当RESTful控制器返回Book对象时,它使用Jackson将Book对象传输到json,并触发mybatis加载Author对象

控制器:在第30行,它只查询图书

在第31行之后,它还查询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:

  • 在Book.getAuthors()上添加
    @JsonIgnore
    ,以防止Jackson调用getAuthors()
  • 在Book.loadDetail()上添加
    @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;
        }
    }