前言
本篇博文使用FastJson 定义message-converters 来处理SpringMVC 返回的对象,转化为Json 字符串输出到客户端,关于FastJson和SpringMVC的配置网上有博文,这里就不在描述了。
解决的场景
当我们构建SSM项目,我们的业务逻辑总会有各种各样的异常发生,为了减少异常对我们系统返回结果的影响,以及对这些异常进行集中处理,SpringMVC 给我们提供了两种方式解决。
方案一【HandlerExceptionResolver】:
- 传统的方式 在代码中实现包org.springframework.web.servlet下的接口 HandlerExceptionResolver,并且实现 resolveException 方法。
- resolveException 参数:
HttpServletRequest request
HttpServletResponse response
Object handler : 处理这个url请求 的Controller 中的method 方法
Exception ex: 业务逻辑抛出的异常 - 代码解释: 这里仅仅用于捕获异常,并且返回统一定义结果ResultStatus 【正常业务也是返回ResultStatus 】,通过Code告知客户端后台运行结果,正常结果 code=“00000”:
public class TestExceptionHandle implements HandlerExceptionResolver{
@Nullable
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
try {
ResultStatus resultStatus = new ResultStatus();
resultStatus.setCode(10000);
resultStatus.setMsg("Exception");
PrintWriter pw = response.getWriter();
pw.write(JSONObject.toJSONString(resultStatus));
pw.close();
} catch (IOException e) {
throw new IllegalStateException(e);
}
return new ModelAndView();
}
}
- Springmvc.xml 加入以下 配置,将异常处理器加载到SprinMVC中:
<!--HandlerExceptionResolver 异常处理器-->
<bean class="com.lot.utils.TestExceptionHandle"/>
- 客户端返回:
{"code":100000,"msg":"Exception"}
方案二【使用注解@ExceptionHandler】:
- Spring 从4.x版本开始提倡java配置和注解结合使用,慢慢离开xml繁琐的配置,所以方案二是方案一的升级版,此方法需要两个新注解
@ControllerAdvice : ControllerAdvice拆分开来就是Controller Advice,功能类似于Spring的Aop。其中包含属性 basePackages,执行切点位置,也可以省略表示全局
@ExceptionHandler :作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息 - 代码示例,无需XML 配置:
@ControllerAdvice
public class ExceptionControllerAdvice {
/**
* 全局异常捕捉处理
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResultStatus errorHandler(Exception ex) {
ResultStatus resultStatus = new ResultStatus();
resultStatus.setCode(1100000);
resultStatus.setMsg("Exception");
return resultStatus;
}
}
总结:
方案一是目前大多数公司都在用的方式,但是方案二是进年来Spring推崇的Java Config思想, 目的减少XML配置,SpringBoot 就是很好的一个示例!