springboot validator校验
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
声明验证策略
// 执行插入时的策略 public interface ValidInsert { } // 执行修改时的策略 Default 是默认策略 public interface ValidUpdate extends Default { }
实体类添加校验注释
class MyTest { private String id; @NotBlank(groups = {ValidInsert.class}) @Length(groups = {ValidInsert.class}, min = 2, max = 50) private String name; @NotNull(groups = {ValidInsert.class}) private Date cat; @NotNull(groups = {ValidInsert.class, ValidUpdate.class}) private Date uat; }
自定义校// 自定义的校验类
// 自定义的校验类 @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented /* @Repeatable的使用有以下几个要点: 在需要重复使用的注解上修饰 @Repeatable @Repeatable中的参数为被修饰注解的容器的类对象(class对象) 容器包含一个value方法,返回一个被修饰注解的数组 */ @Repeatable(NotBlankZero.Values.class) @Constraint(validatedBy = {NotBlankZeroValidator.class}) public @interface NotBlankZero { String message() default "不能为null、空串和不能等于0"; // 哪些校验策略才执行校验 Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Documented @interface Values { NotBlankZero[] value(); } } // 校验实际干活的类 public class NotBlankZeroValidator implements ConstraintValidator<NotBlankZero, Object> { private NotBlankZero constraintAnnotation; @Override public void initialize(NotBlankZero constraintAnnotation) { this.constraintAnnotation = constraintAnnotation; } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { System.out.println(constraintAnnotation); if (value == null) return false; if (value instanceof String) { if (((String) value).length() == 0) return false; return !"0".equals(value); } else if (value instanceof Long) { return !((long) value == 0); } else if (value instanceof Integer) { return !((int) value == 0); } else if (value instanceof Double) { return !((double) value == 0); } else if (value instanceof Float) { return !((float) value == 0); } return true; } }
校验使用
我这里是在业务层添加的 在控制器层添加也可以
@Service @Validated //这里必须有 光方法上面添加无效 class TestService{ @Validated(ValidInsert.class) // 注意这里 @Valid 不添加的话无法校验里面的字段 public void add(@NotNull @Valid MyTest test) { } // NotBlankZero是自定义注解 @Validated({ValidUpdate.class}) public void update(@NotBlankZero String id, @NotNull MyTest test) { } }
这样就可以使用 但是默认是所有错误都校验完成后,一起返回错误信息
我们可以配置只要出现一个错误就直接返回错误,不在往下校验
添加配置
@Configuration public class ValidConfig { @Bean public Validator validator() { // 配置出现错误就返回 默认全部校验完才返回错误 ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() .addProperty(HibernateValidatorConfiguration.FAIL_FAST, "true") .buildValidatorFactory(); return validatorFactory.getValidator(); } @Bean public MethodValidationPostProcessor methodValidationPostProcessor(Validator validator) { MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor(); methodValidationPostProcessor.setValidator(validator); return methodValidationPostProcessor; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2020-03-31 springboot 方法内部调用注解缓存方法无效的问题