阅读 416

Spring 参数校验详解

前言

JCP

JCP 全称 Java社区进程 (Java Community Process,JCP)

JCP 是一个开放性的国际技术标准组织,职责是发展和更新 Java 技术规范。由24个成员组成的执行委员会则是该组织的最高决策机构,负责规划 Java 的技术演进方向。

JSR

JSR 全称 Java 规范提案 (Java Specification Requests,JSR)

是指向JCP提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。

JSR已成为Java界的一个重要标准。

Bean Validation

Bean Validation 顾名思义是对 java Bean 的校验,目前为止,Java 对 Bean 的校验有3个规范。

JSR-303 : Bean Validation

JSR-303规范官网 JSR-303 : Bean Validation,是一项 java 规范提案,并且于2009年11月16日通过提案,正式成为一项 java 规范。

JSR 349 : Bean Validation 1.1

JSR-349规范官网

JSR 349 : Bean Validation 1.1,故名思议,是 Bean Validation 的 1.1 版本,于2013年5月24日通过提案,正式成为一项 java 规范。

JSR 380 : Bean Validation 2.0

JSR-380规范官网

JSR 380 : Bean Validation 2.0,故名思议,是 Bean Validation 的 2.0 版本,于2017年8月21日通过提案,正式成为一项 java 规范。

javax.validation

javax.validation 是 Java 官方提供的对 Bean Validation 规范的实现,它提供了 @NotBlank、@NotNull、@NotEmpty 等注解供我们使用。

maven 坐标如下

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
复制代码

由于 Bean Validation 有多个版本,因此 javax.validation 也提供了对于版本的实现,如图

其中

  • 1.0.x 对应 JSR-303 : Bean Validation
  • 1.1.x 对应 JSR 349 : Bean Validation 1.1
  • 2.0.x 对应 JSR 380 : Bean Validation 2.0

Hibernate-Validator

Hibernate-Validator 是 Hibernate 提供的对 JSR-303 : Bean Validation规范的实现,它基于 javax.validation,并在它的基础上提供了 @Range 、@Length 等注解。

Spring 参数校验

参数校验作为web开发最基础的需求,Spring 自然是对其进行了支持。Spring mvc 中就自带 Hibernate-Validator 框架,用于对 Java bean 类型的参数进行校验。

光有 Hibernate-Validator 还不管,因为参数如果不是 Java bean 就没办法校验,因此 spring 增加了对普通参数类型的支持。

因此在使用 spring 框架进行参数校验时,会使用到多方技术。这就是为什么用于参数校验的注解,有的是来自 javax 、有的是来自 Hibernate、有的又来自 spring的原因。

对 Java bean 类型进行参数校验

参考 使用 Hibernate-Validator 对 Java bean 类型进行参数校验

对普通类型进行参数校验

对普通类型进行参数校验是 spring 框架对 Hibernate-Validator 只能校验 Java bean 的补充。一般用于参数不多的情况(没必要为了一两个参数,单独封装一个 java bean)。

这种情况下,我们可以直接把校验注解打在对应参数上,然后在 controller 上添加 @Validated 注解,这个注解就是 spring 对普通类型参数校验的支持注解。

例子如下

Spring 参数校验的异常处理

参数校验肯定存在校验不通过的情况,校验不通过时会抛出异常,虽然 Spring 对这些异常都进行了默认的处理,但是默认的处理方式并不安全,如下,暴露了很多不该暴露的信息,对于这些异常,我们需要手动处理。

关于如何处理这些异常,请参考

Spring 参数校验的异常处理

参考

为什么要用validator