当前位置: 首页 > 面试题库 >

Java避免在未获取的惰性对象上进行Jackson序列化

水睿
2023-03-14
问题内容

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

当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常:

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的其他答案。但是可能可以通过新的杰克逊功能来实现。

我的版本是:

  • Spring 3.2.5
  • Hibernate 4.1.7
  • Jackson 2.2

提前致谢。


问题答案:

我终于找到了解决方案!感谢Indybee给我一个线索。

Spring 3.1,Hibernate 4和Jackson-Module-Hibernate教程为Spring 3.1和早期版本提供了一个很好的解决方案。但是由于Spring版本3.1.2拥有自己的MappingJackson2HttpMessageConverter,其功能与本教程中的功能几乎相同,因此我们不需要创建此自定义HTTPMessageConverter。

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

从WebMvcConfigurerAdapter扩展spring config类,并重写configureMessageConverters方法。

在该方法中添加MappingJackson2HttpMessageConverter与Hibernate4Module在previus方法进行注册。

我们的配置类应如下所示:

@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....
}

如果你具有xml配置,则也不需要创建自己的MappingJackson2HttpMessageConverter,但是需要创建出现在教程(HibernateAwareObjectMapper)中的个性化映射器,因此xml配置应如下所示:

<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。 当我尝试获取这个用户时,我总是必须加载所有坐标来获取用户对象,否则当Jackson尝试序列化用户时抛出异常: 和控制器: 有办法告诉Jackson不要连载未蚀刻的对象?我一直在寻找3年前发布的实现Jackson-Hibernate-Module的其他答案。但也许可以通过杰克逊的

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

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

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

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