天天看點

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