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