JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践

简介:

任何时候,当要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。

   应用程序必须通过某种手段来确保输入参数在上下文来说是正确的。

   分层的应用在很多时候,同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题。

   为了避免这样或那样的情况发生,最好是将验证逻辑与相应的数据模型进行绑定。

1. JSR-303 Bean Validation

   JSR 是Java Specification Requests 的缩写,是指向 JCP(Java Community Process) 提出新增一个标准化技术规范的正式请求。

   任何人都可以提交 JSR,以向 Java 平台增添新的 API 和服务,已审核通过的规范涉及 Java 各个领域,有兴趣可以了解一下。

   Bean Validation 是一个运行时的数据验证框架,为 JavaBean 验证定义了相应的元数据模型和 API。

   默认的元数据是 Java Annotations,当然也可以使用 XML 可以对已存在的元数据信息进行覆盖和扩展。

   在应用中通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型的正确性。

   constraint 可以注解到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。

   Hibernate Validator 做为 Bean Validation 的参考实现 .提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。

   Sun validation-api.jar 中定义的规范 constraint

   Hiber-Validator 自定义的几个 constraint

2. Spring MVC 服务端验证实践

   只需要很简单的三个步骤,就可以在 Spring MVC 中校验数据模型,首先将需要的 jar 依赖进来

      <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.1.Final</version>
        </dependency>

   然后在需要校验数据模型上添加校验注解,如果数据模型为引入其他公司或项目,编写 xml 同样是可行的。

复制代码
public class UserVO {
    @NotNull(message = "uuid 不能为空!")
    private String uuid;

    @NotEmpty(message = "用户名称不能为空!")
    private String name;

    private String passwd;

    private String sex;

    private Date birthday;
    
    @Length(min = 11, max = 11, message = "电话号码长度必须为11位!")
    private String phone;

    private String photo;

    @Email(message = "电子邮箱地址不合法!")
    private String email;

    private String yxbz;

    private String sorts;

    .....setter/getter
}
复制代码

   最后就是验证并获取结果的过程,你可以硬编码编写通用方法在项目中使用,像下面这样。

复制代码
   private void validBean(Object targerBean) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Object>> violations = validator.validate(targerBean);
        for (ConstraintViolation<Object> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }
复制代码

   或者你可以借助 Spring MVC 封装好的 Validated 注解 和 BindingResult 对象更优雅的完成校验的事情。

   本文只做抛砖引玉之用,具体项目具体场景请自行拿捏。


本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/7354164.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Java 应用服务中间件 Spring
Spring系列文章:Bean的作⽤域
Spring系列文章:Bean的作⽤域
|
1月前
|
Java Spring 容器
Spring系列文章:Bean的获取⽅式
Spring系列文章:Bean的获取⽅式
|
1月前
|
缓存 Java Spring
Spring 框架中 Bean 的生命周期
Spring 框架中 Bean 的生命周期
38 1
|
2月前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
116 0
|
2月前
|
XML 缓存 Java
Spring源码之 Bean 的循环依赖
循环依赖是 Spring 中经典问题之一,那么到底什么是循环依赖?简单说就是对象之间相互引用, 如下图所示: 代码层面上很好理解,在 bean 创建过程中 class A 和 class B 又经历了怎样的过程呢? 可以看出形成了一个闭环,如果想解决这个问题,那么在属性填充时要保证不二次创建 A对象 的步骤,也就是必须保证从容器中能够直接获取到 B。 一、复现循环依赖问题 Spring 中默认允许循环依赖的存在,但在 Spring Boot 2.6.x 版本开始默认禁用了循环依赖 1. 基于xml复现循环依赖 定义实体 Bean java复制代码public class A {
|
2月前
|
存储 缓存 Java
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
|
13天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
21 1
|
16天前
|
前端开发 Java 数据格式
【Spring系列笔记】定义Bean的方式
在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势。
32 2
|
18天前
|
XML 人工智能 Java
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
Spring Bean名称生成规则(含源码解析、自定义Spring Bean名称方式)
|
27天前
|
Java 数据库连接 开发者
浅谈Spring的Bean生命周期
浅谈Spring的Bean生命周期
21 1