关于实体类校验属性必填
实体类
import javax.validation.constraints.NotBlank;
@Data
public class User {
@NotBlank(message="名称为空")
private string username;
@NotBlank(message="密码为空")
private string password;
}
Controller
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
public class UserController {
@PostMapping("/users")
public string createUser(@Valid @RequestBody User user){
return server.insert(user);
}
}
这样写他的返回是有问题的
返回的是
Validation failed for object='asilalMonitorEguipment'. Error count: 2
他是一个未解析的返回体 BindingResult ,我们需要在接参时加上 BindingResult result参数:
@PostMapping("/users")
public string createUser(@Valid @RequestBody User user,BindingResult result){
return server.insert(user,result);
}
并且在service层解析它:
if(result.hasErrors()){
validate = Validator.validate(result);
if(!"".equals(validate)){
new throw Exception(validate);
}
}else{
//逻辑代码
}
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class Validator {
public static String validate(BindingResult result) throws IllegalAccessException {
String errors ="";
var allErrors = result.getAllErrors();
for (var i = 0; i<allErrors.size();i++) {
var objectError = allErrors.get(i);
//errors[i]=objectError;.
errors+="[";
var defaultMessage = objectError.getDefaultMessage();
errors+=defaultMessage;
errors+="]";
}
return errors;//返回为[名称为空][密码为空]
}
}
这样很影响我们的优雅度!!!
找到另一个大神文章https://www.jb51.net/program/329986xl1.htm
只需要添加一个拦截类,就可以一个一个返回 校验失败的信息啦~(名称为空) :
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
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.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.List;
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 自定义验证异常
* MethodArgumentNotValidException 方法参数无效异常
*/
@ResponseStatus(HttpStatus.BAD_REQUEST) //设置状态码为 400
@ExceptionHandler({MethodArgumentNotValidException.class})
public String paramExceptionHandler(MethodArgumentNotValidException e) {
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (exceptions.hasErrors()) {
List errors = exceptions.getAllErrors();
if (!errors.isEmpty()) {
// 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可
FieldError fieldError = (FieldError) errors.get(0);
return fieldError.getDefaultMessage();
}
}
return "请求参数错误";
}
}
完美~~ 撒花~~ ✿✿✿