| 一般编码时有异常我们都会try-catch捕获异常,有时为了区分不同的异常还会一次catch多个异常,大量的try-catch语句,这样使得代码也不够优雅;一个相同的异常处理写多次代码也比较冗余,所以引入全局的异常处理非常必要。 <!--定义异常处理页面--> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">         <property name="exceptionMappings">             <props>                 <prop key="com.creditease.permissionapi.exception.NopermissionException">/permission/noSecurity</prop>             </props>         </property>  </bean> 
 使用SimpleMappingExceptionResolver类处理异常,设置自定义异常类型NopermissionException,以及异常发生后的请求路径/permission/noSecurity。 SpringBoot中采用@RestControllerAdvice或者@ControllerAdvice设置全局异常类。这两者区别类似于@Controller和@RestController注解。SSO中定义了三种全局的异常处理:普通的Exception处理;自定的NopermissionException异常和参数校验异常。
 全局异常处理代码如下: @Configuration @Slf4j @RestControllerAdvice public class GlobalExceptionConfig { //无权限处理 @ExceptionHandler(value = {NopermissionException.class}) public void noPermissionExceptionHandler(HttpServletRequest request, Exception ex, HttpServletResponse response, @Value("${sso.server.prefix}") String domain) throws IOException { printLog(request,ex); response.sendRedirect("跳转到无权限页面地址"); }  //参数校验处理 @ExceptionHandler(value = {BindException.class}) public ResultBody BindExceptionHandler(BindException bindException){ List<ObjectError> errors = bindException.getBindingResult().getAllErrors(); //这个ResultBody是一个返回结果对象,这里需要返回json,里面包含了状态码和提示信息 return ResultBody.buildFailureResult(errors.get(0).getDefaultMessage()); }  //所有未捕获的异常处理逻辑 @ExceptionHandler(value = {Exception.class}) public ResultBody exceptionHandler(HttpServletRequest request,Exception ex){ printLog(request,ex); return ResultBody.buildExceptionResult(); }  //将请求参数和异常打印出来,结合@slf4j注解 public void printLog(HttpServletRequest request,Exception ex){ String parameters = JsonHelper.toString(request.getParameterMap()); log.error("url>>>:{},params>>>:{} ,printLog>>>:{}",request.getRequestURL(),parameters,ex); }  } 
 @RestControllerAdvice结合@Validation,可以对Bean进行校验,校验不通过会抛出BindException异常。通过注解可以少写if-else代码,判断请求的接口参数是否为空,提高代码的美观性。例如:     //常规做法     if(StringUtils.isEmpty(ssoSystem.getSysCode()) //SSO做法 //在Controller请求方法上添加@Valid注解 @RequestMapping(value = "/add", method = RequestMethod.POST) public ResultBody add(@Valid @RequestBody SsoSystem ssoSystem) {  }  //在需要处理的SsoSystem Bean的属性上加@NotNull注解 @NotNull(message = "系统编号不能为空") private String sysCode; 
 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |