天天看点

Hibernate5关于Lazy Json转换错误

@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可以善用,用的好性能提升,用的不好适得其反。