Hibernate5关于Lazy Json转换错误
程序员文章站
2022-04-13 13:06:47
...
@ResponseBody返回Object对象, 该对象将会被ObjectMapper转化为json
如果框架里面使用了hibernate, 而且查询出来的对象有延迟加载的属性
ObjectMapper把对象转化成json 的时候, 会读取lazy property, 这样会触发Lazy获得延迟加载的数据,这并不是我们想要的结果。
@jsonignore 注解掉是可以,但是如果我门哪天突然想获取了,就根本不可能。那么怎么办呢。
Hibernate其实有过这样的Jar包。Maven上可以找到
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
<version>2.9.4</version>
</dependency>
加上这个包之后package com.kd.core.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module.Feature;
public class HibernateAwareObjectMapper extends ObjectMapper{
/**
* @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)
*/
private static final long serialVersionUID = 7958167810745447350L;
public HibernateAwareObjectMapper() {
Hibernate5Module hm = new Hibernate5Module();
hm.configure(Feature.USE_TRANSIENT_ANNOTATION, false);
registerModule(hm);
}
public void setPrettyPrint(boolean prettyPrint) {
configure(SerializationFeature.INDENT_OUTPUT, prettyPrint);
}
}
现在进行说明 其实这个包吧@Transient给默认排除了。只对ORM关系进行处理 也就是你加上 @Transient就不给你转。网上这样的说明很少。懒得看源码的
hm.configure(Feature.USE_TRANSIENT_ANNOTATION, false);
这句话才是重点,必须要写false 让他转换
然后编写springmvc.xml 在<mvc:message-converters ></mvc:message-converters>中加入或者改变成以下配置
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.kd.core.utils.HibernateAwareObjectMapper">
<property name="prettyPrint" value="true"/>
</bean>
</property>
</bean>
至此,你的问题就解决了。其实Lazy可以善用,用的好性能提升,用的不好适得其反。上一篇: 如果能在一起就好了
下一篇: 解答心理咨询师报考条件