首先:
部门与组织是 manytoone 和 onetomany 的关系,并且两张表都有自关联,查询部门信息时会级联查询上级部门以及他的组织结构,然后返回 json 数据时,会出现 $ref
即:
为了攻破它,在两张表的 onetomany 那方,也就是 set 的那方,加一个 fastjson 的注解 @JSONField(serialize = false)
即:
由于我组织结构那里有多个 onetomany,所以我都加上了:
然后在 controller 里面有两种写法:
一:在方法前面加 @ResponseBody,再直接返回一个对象
/** * 部门信息列表展示 * @param response */ @ResponseBody @RequestMapping(value = "/list", method = RequestMethod.GET) public PageView<Department> list(HttpServletResponse response, Integer pageSize, Integer page) { PageView<Department> departmentPageView = departmentService.queryBySerach(null, page, pageSize); //ajaxJson(JSON.toJSONString(departmentPageView, SerializerFeature.DisableCircularReferenceDetect), response); return departmentPageView; }
然后在配置文件里配置:
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> <property name="features"> <array> <value>DisableCircularReferenceDetect</value> </array> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <bean id="DisableCircularReferenceDetect" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> <property name="staticField" value="com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect"></property> </bean>
在使用 Spring 注入时,我们将类信息注入到 com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
这个类中。
在源码中可以看到:
@Override protected void writeInternal(Object obj, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { OutputStream out = outputMessage.getBody(); String text = JSON.toJSONString(obj, features); byte[] bytes = text.getBytes(charset); out.write(bytes); }
我们使用 @ResponseBody 这个注解时,会自动调用 JSON.toJSONString(obj,features)这个方法,里面会带上我们在 Spring 里面配置的属性。
附一种不好的编程习惯:
在加了 @ResponseBody 注解的 Controller 中使用
String result = JSON.toJSONString(obj); return result;
JSON.toJSONString() 这句话执行了两次。
方案二:不用配置文件,直接转 SerializerFeature.DisableCircularReferenceDetect
即:
/** * 部门信息列表展示 * @param response */ @RequestMapping(value = "/list", method = RequestMethod.GET) public void list(HttpServletResponse response, Integer pageSize, Integer page) { PageView<Department> departmentPageView = departmentService.queryBySerach(null, page, pageSize); ajaxJson(JSON.toJSONString(departmentPageView, SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteMapNullValue), response); }
然后 ajaxJson 方法是:
@Controller public class BaseController { protected static final Log log = LogFactory.getLog(BaseController.class); /** ajax输出,返回null ***/ public String ajax(String content, String type, HttpServletResponse response) { try { response.setContentType(type + ";charset=UTF-8"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.getWriter().write(content); response.getWriter().flush(); } catch (IOException e) { log.error("ajax", e); } return null; }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于