前端传数据到后端,后端需要对数据进行必要的数据校验,本人使用SpringBoot的validation
pom文件引入包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
再类上增加校验规则
public class TicketVspRequestBean extends BaseRequestBean{
/**
* 编号。
*/
@NotEmpty(groups ={AskAgainVspTicket.class,ChangeVspTicket.class},message = "唯一编号不能为空")
@Length(groups =CreateVspTicket.class,max= 36)
private String code;
/**
* 类型。
*/
@NotEmpty(groups = CreateVspTicket.class,message = "类型不能为空")
@Size(groups =CreateVspTicket.class,max = 50)
private String type;
public interface CreateVspTicket{}
public interface AskAgainVspTicket{}
public interface ChangeVspTicket{}
}
groups 表示分组在使用的时候可以标识用那个分组的校验规则
使用
@PostMapping("/create")
public void findByConditionAndPage(@Validated(TicketVspRequestBean.CreateVspTicket.class) @RequestBody final TicketVspRequestBean requestBean) {
}
以上即完成对入参的校验,根据标识来校验不同类型的数据。
@Validated与@Valid的不同点
@Valid注解与@Validated注解功能大部分类似;两者的不同主要在于:@Valid属于javax下的,而@Validated属于spring下;@Valid支持嵌套校验、而@Validated不支持,@Validated支持分组,而@Valid不支持。笔者这里只简单介绍@Validated的使用时机
对校验失败的响应处理
@ControllerAdvice
@Slf4j
public class ExceptionHandlerConfig {
/**
* 校验错误拦截处理
*
* @param exception 错误信息集合
* @return 错误信息
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public HttpResult<String> validationBodyException(MethodArgumentNotValidException exception) {
//对校验错误信息进行封装,并输出到日志
BindingResult result = exception.getBindingResult();
StringBuilder errorMessage = new StringBuilder();
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
errors.forEach(p -> {
FieldError fieldError = (FieldError) p;
log.error("数据校验错误 : object{" + fieldError.getObjectName() + "},field{" + fieldError.getField() +
"},errorMessage{" + fieldError.getDefaultMessage() + "}");
errorMessage.append(fieldError.getDefaultMessage());
});
}
log.info("验证字段{}",errorMessage.toString());
return DefaultHttpResultFactory.fail(errorMessage.toString(),null);
}
}
总结常用的有