在使用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返回数据的方式有很多种,有兴趣的同学可以去看看。