首先:
部门与组织是 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;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于