jsr-303
为什么要使用jsr-303?
先看最基础验证前端参数是否符合要求代码
public Result<String> add(@RequestBody User user){
if(user != null){
return Result.failed(-1,"用户不存在");
}
if(StringUtils.isNotBlank(user.getUserName())){
return Result.failed(-1,"用户不存在");
}
System.out.println(user);
return Result.success("成功");
}
可以看到这种验证方式很麻烦,也很不优雅,那么jsr-303可以让我们更加专注逻辑代码,不用写这种参数的校验
springboot整合jsr-303分组验证
pom.xml
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.18.Final</version>
</dependency>
分组
/**
* JR303新增校验分组
*/
public interface AddGroup {
}
/**
* JR303修改校验分组
*/
public interface UpdateGroup {
}
实体类User.java
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "id不能为空",groups = {UpdateGroup.class})
private Long userId;
@NotBlank(message = "名称不能为口",groups = {AddGroup.class, UpdateGroup.class})
private String userName;
@Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号格式错误",groups = {AddGroup.class,UpdateGroup.class})
@NotBlank(message = "手机号码不能为空",groups = {AddGroup.class, UpdateGroup.class})
private String phone;
@Range(min = 1,max = 150,message = "年龄应该1-150岁之间",groups = {AddGroup.class, UpdateGroup.class})
private Integer age;
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", phone='" + phone + '\'' +
", age=" + age +
'}';
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
注解详细信息
控制层DemoController.java
@RestController
public class DemoController {
/**
* 加入@Validated注解生效,AddGroup.class代表只对User类中加入groups = {UpdateGroup.class}属性才验证
* @param user
* @return
*/
@PostMapping("/add")
public Result<String> add(@Validated(AddGroup.class) @RequestBody User user){
System.out.println(user);
return Result.success("成功");
}
@PostMapping("update")
public void update(@Validated(UpdateGroup.class) @RequestBody User user){
System.out.println(user);
}
}
jsr-303异常统一处理(验证参数是否符合要求)
/**
* jsr303异常统一处理
* @author wxd
* @create 2022-11-07 13:23
*/
@Slf4j
//扫描地址
@RestControllerAdvice(basePackages = "com.example.demo.controller")
public class ExceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result handleVaildException(MethodArgumentNotValidException e){
log.error("数据校验出现问题:{},异常类型:{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
StringBuffer stringBuffer = new StringBuffer();
bindingResult.getFieldErrors().forEach(item ->{
//获取错误信息
String message = item.getDefaultMessage();
//获取错误的属性名字
String field = item.getField();
stringBuffer.append(field + ":" + message + " ");
});
return Result.failed(400, stringBuffer + "");
}
@ExceptionHandler(value = Throwable.class)
public Result handleException(Throwable throwable){
log.error("错误",throwable);
return Result.failed(400, "系统异常");
}
}
验证
源码地址
https://github.com/wuxuedong/jsr-303