当前位置: 首页 > 知识库问答 >
问题:

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

边明煦
2023-03-14

我有一个由Spring MVC框架构建的RESTful项目,使用Mybatis ORM。

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

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

有没有办法防止 mybatis 在 RESTful 控制器返回 json 时触发延迟加载?

共有2个答案

殷轶
2023-03-14

我找到了一个解决方案,不是最好的,但它有效。仍然期待更好的解决方案。

注意“任何调用getter的人都会触发延迟加载”(红圈),这也是Jackson在序列化中总是触发延迟加载的原因!

为了解决这个问题,我修改了书豆:

    < li >在Book.getAuthors()上添加< code>@JsonIgnore,防止Jackson调用getAuthors()。 < li >在Book.loadDetail()上添加< code > @ JSON getter(value = " authors "),这样当Jackson可以序列化作者而不会触发懒加载。
越英范
2023-03-14

问题不在于mybatis。问题出在序列化中。如果查询该属性,mybatis 别无选择,只能加载该属性。

解决方案是配置序列化,以便作者属性不被序列化。

这可以通过例如使用Jackson MixIns来完成:

首先,创建指定附加配置的混合:

abstract class NoAuthorsMixIn {
   @JsonIgnore abstract List<Author> authors();
}

然后您需要将此混合添加到spring使用的jackson映射器配置中。具体方式取决于您使用的是xml还是java配置。对于java配置,如下所示:

@Configuration
public class JacksonConfiguration {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.addMixIn(Book.class, NoAuthorsMixIn.class);
        return mapper;
    }
}

请注意,这将禁用所有控制器方法中作者的序列化。如果您需要能够根据控制器和/或控制器方法进行切换,则设置更为复杂(例如,请参见此)

 类似资料:
  • 我有一个简单的控制器返回一个用户对象,这个用户有一个属性坐标,它具有hibernate属性FetchType.lazy。 当我尝试获取这个用户时,我总是必须加载所有坐标来获取用户对象,否则当Jackson尝试序列化用户时抛出异常: 和控制器: 有办法告诉Jackson不要连载未蚀刻的对象?我一直在寻找3年前发布的实现Jackson-Hibernate-Module的其他答案。但也许可以通过杰克逊的

  • 我有一个产生JSON的控制器,从这个控制器,我返回一个实体对象,它由Jackson自动序列化。 现在,我想避免根据传递给控制器的参数返回一些字段。我查看了使用过滤器属性/Mixins等完成此操作的示例。但是我看到的所有示例都要求我使用对象映射器手动序列化/反序列化 Bean。有没有办法在没有手动序列化的情况下执行此操作?我的代码与此类似: 现在,根据传递给控制器的“变量”值,我想显示/隐藏MyEn

  • 问题内容: 我有一个返回用户对象的简单控制器,该用户的属性坐标具有hibernate属性FetchType.LAZY。 当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常: :无法初始化代理-没有会话 这是由于Jackson尝试获取此未获取的对象。这里是对象: 和控制器: 有一种方法告诉杰克逊不要序列化未提取的对象?我一直在寻找3年前发布的

  • 问题内容: 我有一个返回用户对象的简单控制器,该用户的属性坐标具有hibernate属性FetchType.LAZY。 当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常: com.fasterxml.jackson.databind.JsonMappingException:无法初始化代理-没有会话 这是由于Jackson尝试获取此未获取

  • 主要内容:1 编写核心类,2 运行测试本文讲解如何将一个Java对象序列化为一个json文件,然后读取该json文件读取回对象。在下面的示例中,我们创建Student类。使用Jackson存储到一个student.json文件,该文件拥有Student对象的JSON表示形式。 1 编写核心类 MainApp: 2 运行测试

  • 问题内容: 我使用Jackson库将我的pojo对象序列化为表示形式。例如,我有A类和B类: 如果我要序列化类A中的对象,则有可能在序列化时获得递归。我知道我可以通过使用停止它。 是否可以通过深度级别限制序列化? 例如,如果级别为2,则序列化将以这种方式进行: 序列化一个,级别= 0(0 <2正常)->序列化 序列化ab,级别= 1(1 <2 ok)->序列化 序列化ABA,级别= 2(2 <2不