一.概述
在我们设计接口时,往往在逻辑最开始的地方,我们首先面临的就是参数校验,之后才是整体的业务逻辑实现.例如,通过手机号和验证码实现注册功能的接口,首先需要做的就是对手机号进行正则校验,验证码的长度是否正确.在我们引入参数校验框架之后,这些事情可以不用编码,直接使用注解就能完成参数校验框架了.
二.使用
1.@valid和校验注解的使用姿势
(1)例如一个用户注册的接口,有用户名和密码,我们需要对其进行非空校验.
(2)代码
package com.ccm.server.user.controller;
import com.ccm.server.user.controller.req.ValidTestReq;
import com.ccm.server.user.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @Description 参数校验框架测试
* @Author zhouzhiwu
* @CreateTime 2020/7/10 11:37
*/
@RestController
@RequestMapping(value = "validTest")
public class ValidTestController {
/**
* @Description 测试@valid注解
* @Author zhouzhiwu
* @CreateTime 2020/7/10 11:43
* @Params [validTestReq]
* @Return java.lang.Object
*/
@PostMapping(value = "test01")
public Object test01(@Valid @RequestBody ValidTestReq validTestReq) {
return validTestReq;
}
}
package com.ccm.server.user.controller.req;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ValidTestReq {
@NotBlank
private String username;
@NotBlank
private String password;
}
@NotBlank是校验注解,类似的有很多,有正则校验的,校验长度的.
@valid是使这组注解生效一个开关功能.
(3).使用swagger进行接口测试
执行后返回的数据,可以看到注解生效了.明显抛出了异常,spring响应了一个错误数据,虽然不算很友好.
{
"timestamp": "2020-07-10T03:46:44.633+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotBlank.validTestReq.username",
"NotBlank.username",
"NotBlank.java.lang.String",
"NotBlank"
],
"arguments": [
{
"codes": [
"validTestReq.username",
"username"
],
"arguments": null,
"defaultMessage": "username",
"code": "username"
}
],
"defaultMessage": "不能为空",
"objectName": "validTestReq",
"field": "username",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotBlank"
},
{
"codes": [
"NotBlank.validTestReq.password",
"NotBlank.password",
"NotBlank.java.lang.String",
"NotBlank"
],
"arguments": [
{
"codes": [
"validTestReq.password",
"password"
],
"arguments": null,
"defaultMessage": "password",
"code": "password"
}
],
"defaultMessage": "不能为空",
"objectName": "validTestReq",
"field": "password",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotBlank"
}
],
"message": "Validation failed for object='validTestReq'. Error count: 2",
"path": "/validTest/test01"
}
2.@Validated和校验注解的使用姿势
(1)代码,显然@Length注解用来限制长度,我们限制了username和password字段的最大长度为2,类名上的@Validated注解则是使@Length注解生效.
package com.ccm.server.user.controller;
import org.hibernate.validator.constraints.Length;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description @Validated注解测试控制层
* @Author zhouzhiwu
* @CreateTime 2020/07/10 14:02
*/
@Validated
@RestController
@RequestMapping(value = "validatedTest")
public class ValidatedTestController {
/**
* @Description @Validated注解测试
* @Author zhouzhiwu
* @CreateTime 2020/7/10 14:04
* @Params [username, password]
* @Return java.lang.Object
*/
@PostMapping(value = "test01")
public Object test01(@Length(max = 2) @RequestParam String username,
@Length(max = 2) @RequestParam String password) {
return "O(∩_∩)O哈哈~";
}
}
(2)swagger测试,可以看到,spring响应了500的状态码,提示长度不符合要求,控制台也打印了抛出的异常,验证@@Validated生效了.
源码地址:https://gitee.com/chouchimoo/ccm-mall.git(本章节分支:zj-9)
(ps:如果大家觉得文章内容还能过得去,期待得到大家的点赞收藏和转发哦O(∩_∩)O哈哈~)