SpringBoot参数校验,弄懂@Valid注解实现,返回⾃定义响应类⽬的:
对前端请求的数据进⾏格式、长度、是否为空等进⾏校验,可以防⽌脏数据对数据库的影响。
操作⽅式
通过在controller中加⼊@valid对请求参数进⾏校验
⽅式⼀、配合AOP实现
⽅式⼆、配合全局异常实现
@valid基本注解
注解作⽤参数
@Null参数必须为null message=“返回信息”
@NotNull参数必须不为null message=“返回信息”
@NotBlank参数必须不为null,并且长度必须⼤于0message=“返回信息”
@NotEmpty参数必须不为空message=“返回信息”
@Min参数必须⼤于等于该值value=数值,message=“返回信息”
@Max参数必须⼩于等于该值value=数值,message="返回信息@Pattern参数必须满⾜正则表达式regexp=“正则”,message="返回信息@Email参数必须为电⼦邮箱message=“返回信息”
准备内容
0、响应类
public class ResponseObject {
private Integer status;
private Object data;
private String message;
public Integer getStatus(){
return status;
}
public void setStatus(Integer status){
this.status = status;
}
public Object getData(){
return data;
}
public void setData(Object data){
this.data = data;
}
public String getMessage(){
return message;
}
public void setMessage(String message){
}
public static ResponseObject failure(String message){
ResponseObject responseObject =new ResponseObject(); responseObject.setStatus(500);
responseObject.setData(false);
responseObject.setMessage(message);
return responseObject;
}
}
1、实体类
public class User implements Serializable {
/**
* ⽤户名
*/
@NotEmpty(message ="不能为空")
private String username;
@Max(value =20, message ="不能超过20")
@Min(value =10, message ="不能⼩于10")
private Integer num;
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public Integer getNum(){
return num;
}
public void setNum(Integer num){
this.num = num;
}
}
2、Controller
@RestController
public class UserController {
@ParamValid
@GetMapping("/get")
public ResponseObject getUser(@Valid User user, BindingResult bindingResult){ return ResponseObject.failure("");
}
@PostMapping("/post")
public ResponseObject postUser(@Valid@RequestBody User user){
return ResponseObject.failure("");
}
}
3、⾃定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public@interface ParamValid {
}
4、AOP类
@Component
@Aspect
public class ParameterValidAop {
@Before("@annotation(paramValid)")
public void paramValid(JoinPoint point, ParamValid paramValid)throws Exception {
Object[] paramObj = Args();
for(Object obj : paramObj){
if(obj instanceof BindingResult){
BindingResult result =(BindingResult) obj;
if(result.hasErrors()){
List<ObjectError> allErrors = AllErrors();
//返回第⼀个错误
String defaultMessage = (0).getDefaultMessage();
throw new Exception(defaultMessage);
}
}
}
}
}
5、全局异常
@RestControllerAdvice
@Slf4j
public class GlobalException {
/**
* 参数校验异常
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseObject handlerMethodArgumentNotValidException(MethodArgumentNotValidException e){ BindingResult bindingResult = e.getBindingResult();
// 所有参数异常信息
List<ObjectError> allErrors = AllErrors();
return ResponseObject.(0).getDefaultMessage());
}
@ResponseStatus(HttpStatus.OK)
springboot aop@ExceptionHandler(BindException.class)
public ResponseObject handlerBindException(BindException e){
BindingResult bindingResult = e.getBindingResult();
// 所有参数异常信息
List<ObjectError> allErrors = AllErrors();
return ResponseObject.(0).getDefaultMessage());
}
}
实现
⽅法⼀:AOP、
在controller中加⼊@Valid、 @ParamValid注解,以及BindingResult参数
@ParamValid
@GetMapping("/get")
public ResponseObject getUser(@Valid User user, BindingResult bindingResult){
return ResponseObject.failure("");
}
通过postman访问conrtoller地址,写⼊的参数并且不满⾜规则,可以看到会抛出错误异常
可以看到在抛出的异常中,并是不⾃⼰定义的格式,如果想要返回⾃定义的响应实体,需要在全局异常中写⼀个⾃定义异常,并且获取在AOP中抛出的差异,是不是觉得有点⿇烦,在⽤的AOP以后,还需要进⾏额外的代码操作,所以推荐第⼆中⽅式,直接使⽤全局异常进⾏拦截 ,并且返回⾃定义响应。
⽅式⼆:全局异常拦截(推荐)
controller如下:
@GetMapping("/get")
public ResponseObject getUser(@Valid User user){
return ResponseObject.failure("");
}
@PostMapping("/post")
public ResponseObject postUser(@Valid@RequestBody User user){
return ResponseObject.failure("");
}
进⾏请求
可以看到控制台打印了错误信息,意思就是如果出现了不满⾜条件的参数请求,会⾃动抛出异常,那么我们就可以在⾃定义异常中进⾏捕获,代码看上⾯(5、全局异常)。
最后返回结果,就是⾃⼰打印的数据格式:
补充:
可以将所有错误提⽰⼀起返回
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论