我有一个返回用户对象的简单控制器,该用户的属性坐标具有hibernate属性FetchType.LAZY。
当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常:
com.fasterxml.jackson.databind.JsonMappingException:无法初始化代理-没有会话
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的其他答案。但是可能可以通过新的杰克逊功能来实现。
我的版本是:
使用javaconfig,我们也不需要创建HibernateAwareObjectMapper,只需将Hibernate4Module添加到Spring已经拥有的默认MappingJackson2HttpMessageConverter并将其添加到应用程序的HttpMessageConverters中,因此我们需要:
HibernateAwareObjectMapper
Hibernate4Module
MappingJackson2HttpMessageConverter
HttpMessageConverters
从WebMvcConfigurerAdapter扩展spring config类,并重写configureMessageConverters方法。
WebMvcConfigurerAdapter
spring config
configureMessageConverters
在该方法中添加MappingJackson2HttpMessageConverter与Hibernate4Module在previus方法进行注册。
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>
希望这个答案是可以理解的,并且可以帮助任何人找到解决该问题的方法,任何问题都可以随时提出!