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

避免对未提取的惰性对象进行Jackson序列化

司寇经亘
2023-03-14

我有一个简单的控制器返回一个用户对象,这个用户有一个属性坐标,它具有hibernate属性FetchType.lazy。

当我尝试获取这个用户时,我总是必须加载所有坐标来获取用户对象,否则当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;

}

有办法告诉Jackson不要连载未蚀刻的对象?我一直在寻找3年前发布的实现Jackson-Hibernate-Module的其他答案。但也许可以通过杰克逊的一个新功能来实现。

我的版本是:

  • Spring 3.2.5
  • Hibernate4.1.7
  • 杰克逊2.2

提前道谢。

共有1个答案

巫马刚洁
2023-03-14

我终于找到解决办法了!感谢indybee给了我线索。

教程Spring3.1、Hibernate4和Jackson-Module-Hibernate为Spring3.1和更早版本提供了一个很好的解决方案。但是自从版本3.1.2之后,Spring有了自己的MappingJackson2HttpMessageConverter,其功能与教程中的功能几乎相同,所以我们不需要创建这个自定义的HttpMessageConverter。

使用javaconfig我们不需要创建HibernateAwareObjectMapper,我们只需要将Hibernate4Module添加到Spring已经具有的默认MappingJackson2HttpMessageConverter,并将其添加到应用程序的HttpMessageConverters,因此我们需要:

>

  • 从WebMvcConfigurerAdapter扩展spring配置类并重写方法ConfigureMessageConverters。

    在该方法上,添加MappingJackson2HttpMessageConverter和在previus方法中注册的Hibernate4Module。

    我们的config类应该如下所示:

    @Configuration
    @EnableWebMvc
    public class MyConfigClass extends WebMvcConfigurerAdapter{
    
        //More configuration....
    
        /* Here we register the Hibernate4Module into an ObjectMapper, then set this custom-configured ObjectMapper
         * to the MessageConverter and return it to be added to the HttpMessageConverters of our application*/
        public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
            MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    
            ObjectMapper mapper = new ObjectMapper();
            //Registering Hibernate4Module to support lazy objects
            mapper.registerModule(new Hibernate4Module());
    
            messageConverter.setObjectMapper(mapper);
            return messageConverter;
    
        }
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            //Here we add our custom-configured HttpMessageConverter
            converters.add(jacksonMessageConverter());
            super.configureMessageConverters(converters);
        }
    
        //More configuration....
    }
    
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="com.pastelstudios.json.HibernateAwareObjectMapper" />
            </property>
        </bean>
    </mvc:message-converters>
    

    希望这个答案是可以理解的,并帮助人们找到解决这个问题的方法,任何问题都可以随时问!

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

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

    • 问题内容: 我有一个实体: 然后我有一个控制器,其目的是检索书籍,我的问题是,流派字段包含在控制器的json响应中。有什么办法可以排除杰克逊序列化对象时延迟加载的那些字段? 这是我的ObjectMapper的配置: 谢谢! 我无法将其标记为JsonIgnore,因为它将永远在序列化框中。有时候,我将需要随书一起检索体裁,到那时,我将在查询中使用“获取联接”,因此它不会为null。 问题答案: 你可

    • 很抱歉没有提供实际的代码,我的情况完全符合jackson中的问题--不要序列化惰性对象。由于这个问题没有解决方案,所以我强调了这个问题,以确保是否有解决方案,或者在本例中使用什么方法,而不是使用Jackson以JSON格式作为响应发送给对象。 谢谢

    • 我有一个由Spring MVC框架构建的RESTful项目,使用Mybatis ORM。 我启用了延迟加载,这样当我查询 Book 时,它不会查询 Author,除非我调用 book.getAuthor() 方法,并且一切正常。 但是,当 RESTful 控制器返回 Book 对象时,它使用 Jackson 将 Book 对象传输到 json,并触发 mybatis 加载 Author 对象。 有

    • 我有一个实体: 然后我有一个控制器,其目的是检索书籍,我的问题是,我的控制器的json响应中包含了流派字段。有没有办法排除jackson序列化对象时延迟加载的字段? 这是我的ObjectMapper的配置: 谢谢 我不能将其标记为JsonIgnore,因为它将永远脱离序列化框。有时我需要检索书籍的体裁,到那时,我将在查询中使用“fetch join”,这样它就不会为空。