1、什么是JSR303校验
JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint(约束) 的实现,除此之外还有一些附加的 constraint。
JSR303是用于做参数校验的。前端发送到后台的参数,需要校验,比如不能为空、长度、精度等,JSR303可以帮助我们实现。
2、添加ValidationExceptionAdvice
import com.wztsl.springboo.vo.Result;
import org.springframework.util.CollectionUtils;
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.List;
import java.util.Map;
/**
* @author szsw
* @date 2023/2/3 18:15:01
*/
@RestControllerAdvice("com.wztsl.springboo.controller")
public class ValidationExceptionAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result handleValidException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
Map<String, String> map = new HashMap<>();
if (!CollectionUtils.isEmpty(fieldErrors)) {
for (FieldError fieldError : fieldErrors) {
map.put(fieldError.getField(), fieldError.getDefaultMessage());
}
}
return Result.error().put("data", map);
}
}
3、ctrl中需要校验的参数类中添加注解
空检查 | |
---|
@Null | 验证对象是否为null |
@NotNull | 验证对象是否不为null, 无法查检长度为0的字符串 |
@NotBlank | 检查约束字符串是不是Null还有被Trim的长度是否大于0 |
@NotEmpty | 检查约束元素是否为NULL或者是EMPTY. |
Booelan检查 | |
---|
@AssertTrue | 验证 Boolean 对象是否为 true |
@AssertFalse | 验证 Boolean 对象是否为 false |
长度检查 | |
---|
@Size(min=, max=) | 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 |
@Length(min=, max=) | 验证字符串长度 |
日期检查 | |
---|
@Past | 验证 Date 和 Calendar 对象是否在当前时间之前 |
@Future | 验证 Date 和 Calendar 对象是否在当前时间之后 |
数值检查 | 建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null |
---|
@Min | 验证 Number 和 String 对象是否大等于指定的值 |
@Max | 验证 Number 和 String 对象是否小等于指定的值 |
@Digits(Integer=,fraction=,message=“”) | 浮点型校验,Integer代表整数位数,fraction代表小数位数 |
格式检查 | |
---|
@Pattern | 验证 String 对象是否符合正则表达式的规则 |
Result
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
import static com.wztsl.springboo.contants.ResultCode.ERROR;
import static com.wztsl.springboo.contants.ResultCode.SUCCESS;
/**
* @author szsw
* @date 2023/2/3 18:18:15
*/
@Data
public class Result {
private Integer code;
private String message;
private Map<String, Object> map = new HashMap<>();
private Result() {
}
public static Result ok() {
Result r = new Result();
r.setCode(SUCCESS.getCode());
r.setMessage(SUCCESS.getMessage());
return r;
}
public static Result error() {
Result r = new Result();
r.setCode(ERROR.getCode());
r.setMessage(ERROR.getMessage());
return r;
}
public Result put(String key, Object value) {
map.put(key, value);
return this;
}
public Object get(String key) {
return map.get(key);
}
}
ResultCode
/**
* @author szsw
* @date 2023/2/3 18:26:03
*/
public enum ResultCode {
/**
*
*/
SUCCESS(0, "请求成功"),
ERROR(1, "请求失败"),
;
private int code;
private String message;
ResultCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
Ctrl
import com.wztsl.springboo.dto.StartDto;
import com.wztsl.springboo.vo.Result;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;
/**
* @author szsw
* @date 2023/1/17 14:30:46
*/
@RestController
@RequestMapping("/start")
public class StartController {
@GetMapping("/test")
@SuppressWarnings("java:S106")
public Result test() {
Map<String, Object> result = new HashMap<>();
result.put("a", 1);
result.put("b", 2);
result.put("c", 3);
result.put("d", 4);
System.out.println("I am 01");
return Result.ok().put("data", result);
}
@PostMapping("/add")
public Result add(@Valid @RequestBody StartDto startDto) {
return Result.ok();
}
}
Dto
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
/**
* @author szsw
* @date 2023/2/3 18:42:18
*/
@Data
public class StartDto {
@NotEmpty(message = "用户名不能为空")
private String username;
@Length(min = 8, max = 16, message = "密码长度为8~16位")
private String password;
}