Spring Boot实战之全局异常捕获 实现参数异常检查返回统一错误信息

来源:互联网 发布:51电子单片机原理图 编辑:程序博客网 时间:2024/05/17 08:49

Spring Boot实战之全局异常处理实现参数非法性检查


在一个项目中的异常我们我们都会统一进行处理的,本文实现对接口中传入的参数进行非法性检查,当参数非法时,抛出异常,然后返回统一的错误信息。


1、添加测试Bean,测试类中定义几个字段,并且每个字段都做一定的限制

package com.xiaofangtech.sunt.bean;import javax.validation.constraints.AssertFalse;import javax.validation.constraints.Size;import org.hibernate.validator.constraints.Range;public class BeanValidation {@Size(min=6,max=10)private String field1;@Range(min=0,max=1)private Long field2;@AssertFalseprivate Boolean field3;public String getField1() {return field1;}public void setField1(String field1) {this.field1 = field1;}public Long getField2() {return field2;}public void setField2(Long field2) {this.field2 = field2;}public Boolean getField3() {return field3;}public void setField3(Boolean field3) {this.field3 = field3;}}


2、添加测试接口,接口中使用@Validated注解对参数进行合法性检查,如果参数合法,返回原始数据

        @RequestMapping("globalexceptiontest")public Object globalExceptionTest(@Validated @RequestBody BeanValidation data){ResultMsg resultMsg = new ResultMsg(ResultStatusCode.OK.getErrcode(), ResultStatusCode.OK.getErrmsg(), data);return resultMsg;}

3、如果未添加全局异常处理,将会使用默认的异常处理,返回结果,如下图



返回的结果和自己的数据结构有很大的差异,对于前端处理返回结果也很麻烦


4、自定义参数异常返回的数据类ArgumentInvalidResult

package com.xiaofangtech.sunt.utils;public class ArgumentInvalidResult {private String field;private Object rejectedValue;private String defaultMessage;public String getField() {return field;}public void setField(String field) {this.field = field;}public Object getRejectedValue() {return rejectedValue;}public void setRejectedValue(Object rejectedValue) {this.rejectedValue = rejectedValue;}public String getDefaultMessage() {return defaultMessage;}public void setDefaultMessage(String defaultMessage) {this.defaultMessage = defaultMessage;}}



5、添加全局异常处理类GlobalExceptionHandler

package com.xiaofangtech.sunt.exception;import java.util.ArrayList;import java.util.List;import javax.servlet.http.HttpServletRequest;import org.springframework.validation.FieldError;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import com.xiaofangtech.sunt.utils.ArgumentInvalidResult;import com.xiaofangtech.sunt.utils.ResultMsg;import com.xiaofangtech.sunt.utils.ResultStatusCode;@ControllerAdvice//如果返回的为json数据或其它对象,添加该注解@ResponseBodypublic class GlobalExceptionHandler {//添加全局异常处理流程,根据需要设置需要处理的异常,本文以MethodArgumentNotValidException为例@ExceptionHandler(value=MethodArgumentNotValidException.class)public Object MethodArgumentNotValidHandler(HttpServletRequest request,MethodArgumentNotValidException exception) throws Exception{//按需重新封装需要返回的错误信息List<ArgumentInvalidResult> invalidArguments = new ArrayList<>();//解析原错误信息,封装后返回,此处返回非法的字段名称,原始值,错误信息for (FieldError error : exception.getBindingResult().getFieldErrors()) {ArgumentInvalidResult invalidArgument = new ArgumentInvalidResult();invalidArgument.setDefaultMessage(error.getDefaultMessage());invalidArgument.setField(error.getField());invalidArgument.setRejectedValue(error.getRejectedValue());invalidArguments.add(invalidArgument);}ResultMsg resultMsg = new ResultMsg(ResultStatusCode.PARAMETER_ERROR.getErrcode(), ResultStatusCode.PARAMETER_ERROR.getErrmsg(), invalidArguments);return resultMsg;}}


6、运行测试

1、当参数合法





当参数非法,返回与参数合法时有相同风格的错误信息



3 0
原创粉丝点击