在springboot项目中对前端请求的参数进行校验常用的注解:
@NotBlank,@NotNull,@Valid
示例:
public class UserRequest {
@NotNull(message = "id不能为空")
private long id;
@NotBlank(message = "名字不能为空")
@Length(min = 1, max = 50, message = "名字名称长度不能大于50")
@Pattern(regexp ="[0-9A-Z_\\-]+", message = "名字只能为数字和大写字母组合")
private String name;
//省略get/set方法
}
要使参数校验生效要注意其方法使用@Valid注解标注实体,如:
@PostMapping("/update")
public MyResponse updateRequest(@Valid @RequestBody UserRequest request) {
//业务逻辑xxx
return MyResponse.ok();
}
当请求中name字段为空,系统会返回系统定义默认的异常,并没有返回注解上打印的提示信息
那如果将注解上对应的提示信息进行返回给前端呢?
**
* 参数校验 异常捕捉处理类
*/
@ControllerAdvice
public class WebExceptionHandler {
/**
* 请求参数格式错误 @RequestBody上valid失败后抛出的异常是MethodArgumentNotValidException异常;我们可以根据不同的异常类在系统中进行配置拦截处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public MyResponse MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
MyResponse re = new MyResponse();
re.setCode("500");
re.setMsg(message);
return re;
}
}
在调用更新接口查看返回结果:
可以发现接口确实把校验为通过的请求返回了,但是如果这个参数多个校验都没有通过,接口会校验提示的信息都返回,那如何只要有校验失败了,就结束返回呢?
添加一个配置类
package com.test;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import javax.validation.*;
/**
* 通过这个配置改成校验参数时只要出现校验失败的情况,就立即抛出对应的异常,结束校验,不再进行后续的校验
*/
@Configuration
public class WebConfig {
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
//failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。
.failFast(true)
.buildValidatorFactory();
return validatorFactory.getValidator();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
}
在调用更新接口,接口返回如下:
这样就可以返回一个具体校验的参数给前端。