依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
规范内嵌的约束注解
异常统一处理
import com.fan.entity.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
/**
* 校验异常拦截
*/
@Slf4j
@RestControllerAdvice(basePackages = "com.fan.controller")
public class ValidationExceptionConfig {
@ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
public Result<Map<String, String>> handleValidationException(Exception e) {
BindingResult bindingResult = null;
if (e instanceof MethodArgumentNotValidException) {
bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
} else if (e instanceof BindException) {
bindingResult = ((BindException) e).getBindingResult();
}
Map<String, String> errorMap = new HashMap<>();
assert bindingResult != null;
// 获取所有错误参数
bindingResult.getFieldErrors().forEach((fieldError ->
errorMap.put(fieldError.getField(), fieldError.getDefaultMessage())));
// 获取第一个错误参数
String msg = "";
for (FieldError fieldError : bindingResult.getFieldErrors()) {
msg = fieldError.getDefaultMessage();
break;
}
return Result.build(Result.CODE_FAIL, msg, errorMap);
}
}
或者
import com.fan.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Map;
import java.util.Objects;
/**
* 校验异常拦截
*/
@Slf4j
@RestControllerAdvice(basePackages = "com.fan.controller")
public class ValidationExceptionConfig {
/**
* 拦截参数校验错误的消息
*/
@ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
public Result<Map<String, String>> handleValidationException(Exception e) {
BindingResult bindingResult = null;
if (e instanceof MethodArgumentNotValidException) {
bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
} else if (e instanceof BindException) {
bindingResult = ((BindException) e).getBindingResult();
}
// 获取第一个错误参数
String msg = "请求参数错误";
if (Objects.nonNull(bindingResult)) {
for (FieldError fieldError : bindingResult.getFieldErrors()) {
msg = fieldError.getDefaultMessage();
break;
}
}
return Result.failMsg(msg);
}
}
使用示例
使用@Valid
指定需要校验。
/**
* 登录接口
*/
@RequestMapping("/login")
public Result<String> login(@RequestBody @Valid LoginDto loginDto) {
try {
System.out.println(loginDto);
return Result.successMsg("登录成功");
} catch (Exception e) {
log.error("登录异常:" + e);
return Result.errorMsg(e.getMessage());
}
}
校验示例
public class StudentBean implements Serializable{
@NotBlank(message = "用户名不能为空")
private String name;
@Min(value = 18, message = "年龄不能小于18岁")
private Integer age;
@Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
private String phoneNum;
@Email(message = "邮箱格式错误")
private String email;
@MyConstraint
private String className;
@Size(min=2, max=30, message="Name must be between 2 and 30 characters")
private String name;
@NotNull(message = "任课老师不能为空")
@Size(min = 1, message = "至少有一个老师")
private List<TeacherBean> teacherBeans;
}