在使用spring MVC開發過程中,為了提高項目執行效率,所以在一些外鍵字段的實體中會注解”@ManyToOne(fetch = FetchType.LAZY)”以實現延遲加載的效果。
但是,在使用ajax請求數據,當需要返回的序列化數據中包含延遲加載的屬性時,會出現錯誤,延遲加載的屬性無法進行序列化。在這個時候,我們需要暫時取消延遲加載,以取到所有需要的數據。
可是,這樣又會造成一堆垃圾數據的產生、序列化、傳遞至前台。
所以需要在控制層進行數據過濾,只序列化需要的數據。
具體過濾方法如下:
String jsonString = ""; ObjectMapper objectMapper = new ObjectMapper(); //過濾懶加載屬性 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false); //過濾后時間屬性格式 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //設置需要保留的字段(id,memberId.name,orderId.serviceTime) objectMapper.setFilters(JsonFilterUtil.getFilterOut("id","memberId","name","orderId","serviceTime")); objectMapper.addMixIn(TourRecord.class,JsonFilterUtil.getObjectFilterMinIn()); //需要過濾的外鍵類型 objectMapper.addMixIn(Member.class,JsonFilterUtil.getObjectFilterMinIn()); objectMapper.addMixIn(Order.class,JsonFilterUtil.getObjectFilterMinIn()); try { //序列化數據 jsonString = objectMapper.writeValueAsString(tourRecords); } catch (JsonProcessingException e) { e.printStackTrace(); } map.put("tourList", jsonString);
要實現過濾json返回數據的方式有很多種,有興趣的同學可以去看看。