一样平常编码时有非常我们城市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;
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|