• Spring Boot系列(四) Spring Boot 之验证


    这节没有高深的东西, 但有一些学习思路值得借鉴.

    JSR 303 (Bean Validation)

    Maven依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    

    Spring Boot 1.4 开始提出命名规则, 官方使用spring-boot-starter-${name} , 三方使用 {name}-spring-boot-starter.

    使用

    一般只需要在需要验证的请求参数加 @Valid 即可. 对于通用的验证 annotation 如 @NotNull , @Max 等, 不需要做任何其他操作.

    Spring 也提供了 API 形式的断言, 如 Assert.hasText(user.getName(),"字段值不能为空")

    Java 的断言有专门的关键字, 如 assert user.getId()>1000

    断言耦合了业务逻辑. 避免耦合可以使用 HandlerIntercepter 或者 Filter 做拦截. 也可以使用 AOP 切面来完成. 但上述均不是统一的标准实现.

    自定义验证逻辑

    参考 Spring 已经实现的其他验证逻辑.

    1. 定义注解
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    @Documented
    @Constraint(validatedBy = { })
    public @interface Card {
    
    1. 理解注解上的 @Constraint,

    2. 实现 public interface ConstraintValidator<A extends Annotation, T>

    为什么不建议使用 String.split()? 因为其使用了正则, 其次容易出异常. 建议使用三方封装. 可以使用StringUtils.delimitedListToStringArray() 或 commons-lang3包的 StringUtils 或使用 JDK 的 StringTokenizer.

    1. 注解 Card 上修改 @Constraint(validatedBy = { CardValidation }) 指定验证的类.

    2. 通过定义类似 String message() default "{javax.validation.constraints.DecimalMax.message}"; 可以实现国际化.

  • 相关阅读:
    docker
    opencart
    Why is setTimeout(fn, 0) sometimes useful?
    linux下php环境配置
    xampp for linux
    Where to go from here
    freefcw/hustoj Install Guide
    khan academy js
    SDWebImage
    基于OpenCV 的iOS开发
  • 原文地址:https://www.cnblogs.com/walkinhalo/p/10826996.html
Copyright © 2020-2023  润新知