hibernate懶載入導致jackjson解析json時StackOverFlow

來源:互聯網
上載者:User

標籤:.json   ignore   cas   mapped   str   add   測試   any   sim   

@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties

jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是為瞭解決對象中存在雙向引用導致的無限遞迴(infinite recursion)問題。這些標註均可用在屬性或對應的get、set方法中。  


@JsonBackReference和@JsonManagedReference:這兩個標註通常配對使用,通常用在父子關係中。@JsonBackReference標註的屬性在序列化(serialization,即將對象轉換為json資料)時,會被忽略(即結果中的json資料不包含該屬性的內容)。@JsonManagedReference標註的屬性則會被序列化。在序列化時,@JsonBackReference的作用相當於@JsonIgnore,此時可以沒有@JsonManagedReference。但在還原序列化(deserialization,即json資料轉換為對象)時,如果沒有@JsonManagedReference,則不會自動注入@JsonBackReference標註的屬性(被忽略的父或子);如果有@JsonManagedReference,則會自動注入自動注入@JsonBackReference標註的屬性。  

@JsonIgnore:直接忽略某個屬性,以斷開無限遞迴,序列化或還原序列化均忽略。當然如果標註在get、set方法中,則可以分開控制,序列化對應的是get方法,還原序列化對應的是set方法。在父子關係中,當還原序列化時,@JsonIgnore不會自動注入被忽略的屬性值(父或子),這是它跟@JsonBackReference和@JsonManagedReference最大的區別。

 

@JsonIgnoreProperties 用法

 

[java] view plain copy 
  1. //忽略parent models屬性  
  2. @JsonIgnoreProperties({"parent","models"})  
  3. public class Module{  
  4.      @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)  
  5.      public java.util.List<Module> models;  
  6.   
  7.      @ManyToOne(fetch=FetchType.LAZY)  
  8.      @JoinColumn(name="parent_id",referencedColumnName="id")  
  9.      public Module parent;  
  10. }  


 

@JsonFilter用法

 

[java] view plain copy 
  1. //忽略parent models屬性  
  2. @JsonFilter("module")  
  3. public class Module{  
  4.      @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)  
  5.      public java.util.List<Module> models;  
  6.   
  7.      @ManyToOne(fetch=FetchType.LAZY)  
  8.      @JoinColumn(name="parent_id",referencedColumnName="id")  
  9.      public Module parent;  
  10. }  
[java] view plain copy 
  1. 測試代碼:  
  2. Module module=moduleService.findModuleByName("檔案管理");  
  3. ObjectMapper mapper=new ObjectMapper();  
  4. FilterProvider filterProvider=new SimpleFilterProvider().addFilter("module", SimpleBeanPropertyFilter.serializeAllExcept("parent","models"));  
  5. mapper.setFilters(filterProvider);  
  6. String resultString=mapper.writeValueAsString(module);  

 


 


JsonFilter可以動態指定過濾的屬性,缺點:每次轉換都要設定過濾器,否則會報錯,就這點很不爽。既然不爽就換種方式過濾,使用fastjson,請看下面的代碼:

 

[java] view plain copy 
  1. package com.company.project.common.util;  
  2.   
  3. import java.util.Map;  
  4. import java.util.Map.Entry;  
  5. import java.util.Set;  
  6.   
  7. import com.alibaba.fastjson.JSON;  
  8. import com.alibaba.fastjson.serializer.JSONSerializer;  
  9. import com.alibaba.fastjson.serializer.PropertyFilter;  
  10. import com.alibaba.fastjson.serializer.SerializeWriter;  
  11. import com.alibaba.fastjson.serializer.SerializerFeature;  
  12.   
  13. public class JsonHelpler {  
  14.           
  15.         public static String toJSON(Object o){  
  16.             return JSON.toJSONString(o,SerializerFeature.WriteMapNullValue);  
  17.         }  
  18.   
  19.          public static SerializeWriter toJSON(Object obj, final Map<Class<?>, Set<String>> includeMap){  
  20.              PropertyFilter filter = new PropertyFilter() {  
  21.                 @Override  
  22.                 public boolean apply(Object source, String name, Object value) {  
  23.                     for(Entry<Class<?>, Set<String>> entry : includeMap.entrySet()) {    
  24.                         Class<?> class1 = entry.getKey();    
  25.                         if(source.getClass() == class1){    
  26.                             Set<String> fields = entry.getValue();    
  27.                             for(String field : fields) {    
  28.                                 if(field.equals(name)){    
  29.                                     return false;    
  30.                                 }    
  31.                             }    
  32.                         }    
  33.                     }  
  34.                     return true;   
  35.                 } };  
  36.                 SerializeWriter sw = new SerializeWriter();   
  37.                 JSONSerializer serializer = new JSONSerializer(sw);  
  38.                 serializer.getPropertyFilters().add(filter);  
  39.                 serializer.write(obj);  
  40.                 return sw;  
  41.          }  
  42.            
  43. }  
  44.   
  45. 測試代碼  
  46. Map<Class<?>, Set<String>> includeMap =  new HashMap<Class<?>, Set<String>>();  
  47. Set<String> set = new HashSet<String>();  
  48. set.add("parent");  
  49. set.add("models");  
  50. includeMap.put(Module.class, set);  
  51. SerializeWriter resultString=JsonHelpler.toJSON(module, includeMap);  
  52. System.out.println(resultString);  

hibernate懶載入導致jackjson解析json時StackOverFlow

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.