本文描述了当系统内部错误时,如何把JSON对象返回给前台
public class ExceptionResolver implements HandlerExceptionResolver {
public static final long serialVersionUID = 1L;
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mv = new ModelAndView();
MappingJackson2JsonView view = new MappingJackson2JsonView();
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put("msg", "随便写点什么");
attributes.put("resultCode", "系统错误");
view.setAttributesMap(attributes);
mv.setView(view);
return mv;
}
}
不使用MappingJackson2JsonView
同Jaskson,我们自己也可以继承了AbstractView,然后重写AbstractView的抽象方法renderMergedOutputModel
方法体里这样实现
@Override
protected void renderMergedOutputModel(Map<String,Object> model,HttpServletRequest request,HttpServletResponse response) throws Exception{
//创建给前端返回的字符串
String aa="{\"msg\":\"系统异常\"}";
ServletOutputStream out=response.getOutputStream();
out.write(aa.getBytes());
out.flush();
out.close();
}
这样直接mv.setView(V);当项目出异常的时候,前端就直接显示msg:系统异常了
更简单直接的方法:直接将上述renderMergedOutputModel方法内的内容,挪动到resolveException中,这样也不用创建AbstractView的子类了
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
String aa="{\"msg\":\"系统异常\"}";
ServletOutputStream out=response.getOutputStream();
out.write(aa.getBytes());
out.flush();
out.close();
return new ModelAndView();
}
本文的方式使用了最底层的request和response,而你可以使用更简洁的方式,可以参考ExceptionHandler,但是你需要注意ExceptionHandler无法获取request和response,相对来说失去了灵活性,带来了便利性