学习记录之VALIDATION
Spring Validation的主要作用是检查请求参数的基本格式。
关于检查请求参数:
需要注意:在开发实践中,无论是客户端的项目(例如网页前端),还是服务器端的项目,都需要对用户填写、选择的数据进行检查!
其实,最终能够保证数据有效的一定是服务器端的检查,所以,服务器端必须对请求参数进行检查,仅当数据的基本格式有效后,才进行相关的处理。
客户端的检查应该是不作为最终保障的,在前后端分离的模式下,服务器端无法保证所有客户端都采取了统一、有效的验证规则!因为客户端的检查可能并未实现、用户设备中客户端软件的版本并未升级,甚至,客户端软件是可能伪造、篡改的。
即使客户端的检查不一定是可靠的,但是,所有客户端仍应该对请求参数进行检查,如果参数的基本格式不符合要求,则不应该提交请求!毕竟客户端的检查可以把绝大部分错误拦截掉(不会低级错误的请求发到服务器端),以减轻服务器端的压力。
在Spring Boot项目中,使用Spring Boot Validation的依赖项是:
基本使用:
在控制器处理请求的方法中,对需要验证的请求参数添加`@Valid`或`@Validated`注解,表示此参数是需要通过Spring Boot Validation进行检查的,例如:
在封装了请求参数的POJO类中,在各需要验证格式的属性之前,添加检查格式的注解,即可实现格式的验证,例如:
处理异常:
当请求参数不符合注解对应的规则时,将抛出`org.springframework.validation.BindException`,所以,应该在统一处理异常的类中,对此异常进行处理。
先在`ServiceCode`中添加新的业务状态码,对应请求参数格式错误:
然后,`GlobalExceptionHandler`中对此异常进行处理:
在`BindException`的错误信息(`message`)中,将包含大量的信息,不利于响应到客户端去,例如,以上处理方式的响应大概是:
为了保证处理异常后响应的消息是易于阅读的,应该对错误信息(`message`)进行处理:
关于检查参数格式的注解:
@NotNull`:不允许为`null`,即必须提交此名称对应的参数
@NotEmpty`:不允许为空字符串(长度为0的字符串) 注意:只能应用于字符串格式的参数
`@NotBlank`:不允许为空白(字符串长度可能大于0,却是由空格、TAB等空白输入的)
注意:只能应用于字符串格式的参数
`@Min`:设置数值类型的最小值 仅用于数值类型的请求参数 可被`@Range`取代
`@Max`:设置数值类型的最大值 仅用于数值类型的请求参数 可被`@Range`取代
`@Range`:设置数据类型的取值区间,可设置最小值和最大值 此注解的`min`属性默认为`0`,`max`属性默认为`long`类型的最大值 仅用于数值类型的请求参数
`@Pattern`:配置正则表达式 不能取代`@NotNull`注解
在开发实践中,对于字符串类型的请求参数,应该同时使用`@NotNull`(如果你认为必须提交)和`@Pattern`,而`@NotEmpty`、`@NotBlank`通常不需要使用,除非你对此字符串的值没有太多要求,对于数值类型的请求参数,应该同时使用`@NotNull`和`@Range`。
需要注意:对于数值类型的属性,如果提交的请求参数不能够转换成数值类型,则这些注解将不生效,且报错。另外,在开发实践中,通常会将使用到的正则表达式、出错时的提示文本封装在专门的类或接口中,各POJO类型直接引用即可。