Valid注解使用及扩展
@Valid注解使用及扩展一、@Vaild注解介绍使用@Vaild注解可以简化入参的校验,配合统一异常实现简单快捷的入参校验,具体使用参照以下
二、@Vaild具体使用1、引入jar包如果你是springboot项目,此依赖内已经引入,无需再次引入
代码语言:javascript复制
如果没有,将依赖jar包引入到自己的项目中,maven依赖如下
代码语言:javascript复制
2、在入参请求类中添加限制注解代码语言:javascript复制import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserReq implements Serializable {
private Integer id;
@NotBlank(message = "用户名不能为空")
@Length(message = "用户名最大为{max}个字符", max = 20)
private String username;
@NotBlank(message = "密码不能为空")
@Length(message = "密码长度限制为{min}-{max}", min = 8, max = 16)
private String password;
@NotNull(message = "性别不能为空")
private Byte sex;
@Range(message = "年龄范围为{min}-{max}", min = 0, max = 120)
private Integer age;
}3、控制器中使用@Vaild代码语言:javascript复制import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController {
@PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req){
log.info(JSON.toJSONString(req));
return "成功";
}
}4、请求进行测试 虽然拦截成功,但错误出参不知道所以然,一头雾水,需进行优化
三、优化出参1、修改控制器代码语言:javascript复制import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController {
@PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req, BindingResult result){
// 如果发生错误,则返回第一个错误信息,这里也可以自定义返回信息
if(result.hasErrors()){
String message = result.getAllErrors().get(0).getDefaultMessage();
log.error(message);
return message;
}
log.info(JSON.toJSONString(req));
return "成功";
}
}2、请求进行测试四、使用统一异常1、创建统一异常捕获类代码语言:javascript复制import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@Slf4j
@ControllerAdvice
public class MyExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public ResultData exceptionHandler(Exception exception){
log.error("统一异常", exception);
// 捕获对应异常进行处理,默认返回第一个错误信息,这里也可以自定义返回信息
if(exception instanceof MethodArgumentNotValidException){
MethodArgumentNotValidException ex = (MethodArgumentNotValidException) exception;
String message = ex.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return ResultData.getFailResult(message);
}
return ResultData.getFailResult("服务器繁忙,请稍后再试!");
}
}2、此时控制器不需要做额外处理代码语言:javascript复制import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController {
@PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req){
log.info(JSON.toJSONString(req));
return "成功";
}
}3、请求进行测试五、验证注解1、官方的验证注解验证注解
说明
@Null
只能为null
@NotNull
不能为null
@NotEmpty
不为null、不能为空字符串(字符串长度不为0、集合大小不为0)
@NotBlank
不为null、不能为空字符串,不同于@NotEmpty,@NotBlank会去掉空格再判断
@AssertFalse
必须为false
@AssertTrue
必须为true
@DecimalMax(value)
必须为一个不大于指定值的数字
@DecimalMin(value)
必须为一个不小于指定值的数字
@Max(value)
必须为一个不大于指定值的数字
@Min(value)
必须为一个不小于指定值的数字
@Digits(integer,fraction)
必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future
必须是一个将来的日期
@Past
必须是一个过去的日期
@Pattern(value)
必须符合指定的正则表达式
@Length(max,min)
字符长度必须在min到max之间
验证注解的元素值是Email
2、自定义验证注解1)定义注解代码语言:javascript复制import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = {SexConstraintValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SexConstraint {
String message() default "性别有误,请确认";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}2)定义校验器代码语言:javascript复制import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class SexConstraintValidator implements ConstraintValidator
@Override
public void initialize(SexConstraint sexConstraint) {
System.out.println("初始化信息");
}
@Override
public boolean isValid(Byte sex, ConstraintValidatorContext constraintValidatorContext) {
if(sex==null)
return false;
if(sex!=0 && sex!=1 && sex!=2)
return false;
return true;
}
}3)使用注解代码语言:javascript复制import com.banmoon.lol.config.annotation.SexConstraint;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserReq implements Serializable {
private Integer id;
@NotBlank(message = "用户名不能为空")
@Length(message = "用户名最大为{max}个字符", max = 20)
private String username;
@NotBlank(message = "密码不能为空")
@Length(message = "密码长度限制为{min}-{max}", min = 8, max = 16)
private String password;
@SexConstraint
private Byte sex;
@Range(message = "年龄范围为{min}-{max}", min = 0, max = 120)
private Integer age;
}4)请求进行测试
最新发布
-
世界杯体操赛凌洁夺取女子高低杠金牌
2025-10-18 07:57:11 -
天天魔塔周年庆狂欢月
2025-06-04 16:17:10 -
临仙三界共庆·2025仙缘盛会——千年庆典开启跨服争霸与秘境探索之旅
2025-04-16 10:23:07 -
《魔女小卡》盛夏狂欢庆典:魔法学院争霸赛暨2025年度限定皮肤免费送
2025-07-09 22:56:38 -
广告推广是什么
2025-10-07 01:45:33 -
赤金皇城:皇城争霸之巅峰对决
2025-06-22 15:41:25 -
《封魔》2025年夏日盛典:跨服巅峰对决暨稀有坐骑限时掉落狂欢庆典
2025-06-22 20:18:54 -
永诚AE86汽车灯光升级店
2025-10-13 01:11:11 -
瞬睒的解釋
2025-10-01 17:29:00 -
盘点十五种适合乡镇的店铺
2025-10-16 22:31:27