背景:SpringBoot版本 2.1.2.RELEASE 。在做一个API接口需要数据校验把错误信息返回给前端,发现网上找的很多方法都是过时的,这里整理了一下,希望对大家有帮助。废话不多说,下面是正文内容↓
首先导包 (我是gradle,maven改一下就可以)
compile group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: '2.1.2.RELEASE'
然后在要验证字段的dto/entity内添加配置
import lombok.Data;
import javax.validation.constraints.Pattern;
/**
* @Classname DictDto
* @Description 字典 传输类
* @Date 2020-04-29 9:53
* @Created by deedywu
*/
public final class DictDto {
@Data
public static final class ParentInsert {
@Pattern(regexp = "[a-zA-Z0-9_]{1,36}", message = "字段应该在1-36位之间且只能是字母数字组成")
private String field;
...
}
}
再在全局异常拦截里进行配置
import com.gecxkj.common.util.ResponseResult;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
/**
* @Classname ControllerAdvice
* @Description 全局处理
* @Date 2020/4/2 15:11
* @Created by deedywu
*/
@ControllerAdvice
public class MyControllerAdvice {
...
/**
* 全局异常捕捉处理
*
* @param ex exception
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResponseResult errorHandler(Exception ex) {
ex.printStackTrace();
ResponseResult rr = new ResponseResult();
if (ex instanceof BindException) {
// 获取是否有字段验证的异常
BindingResult bindingResult = ((BindException) ex).getBindingResult();
if (bindingResult.hasErrors() && bindingResult.hasFieldErrors()) {
FieldError fieldError = bindingResult.getFieldError();
rr.setResult(500, fieldError.getDefaultMessage(), fieldError.getField());
} else {
rr.setResult(500, ex.getMessage());
}
} else {
rr.setResult(500, ex.getMessage());
}
return rr;
}
}
ResponseResult 类
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Classname ResponseResult
* @Description 公共的前端返回
* @Date 2020/4/1 15:22
* @Created by deedywu
*/
@Data
@NoArgsConstructor
public final class ResponseResult {
/**
* 返回状态码
*/
private Integer code = 400;
/**
* 返回错误信息
*/
private String msg = "返回错误";
/**
* 返回数据
*/
private Object data;
public void setResult(Integer code, String msg, Object data) {
setResult(code, msg);
this.data = data;
}
public void setResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
最后在controller进行配置 ,入参加入@Valid注解就可以了
@PostMapping("parent")
@ResponseBody
@ApiOperation(value = "父级字典编辑操作", notes = "根据有无id编辑/新增")
public ResponseResult parentEdit(@Valid DictDto.ParentInsert payload) {
ResponseResult rr = new ResponseResult();
if (dictService.insert(payload)) {
rr.setResult(200, "新增字典类型成功!");
}
return rr;
}
输入一个空置测试成功...