本文共 3863 字,大约阅读时间需要 12 分钟。
在我们设计接口时,往往在逻辑最开始的地方,我们首先面临的就是参数校验,之后才是整体的业务逻辑实现.例如,通过手机号和验证码实现注册功能的接口,首先需要做的就是对手机号进行正则校验,验证码的长度是否正确.在我们引入参数校验框架之后,这些事情可以不用编码,直接使用注解就能完成参数校验框架了.
(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 ccm * @CreateTime 2020/7/10 11:37 */@RestController@RequestMapping(value = "validTest")public class ValidTestController { /** * @Description 测试@valid注解 * @Author ccm * @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;@Datapublic 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"}
(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 ccm * @CreateTime 2020/07/10 14:02 */@Validated@RestController@RequestMapping(value = "validatedTest")public class ValidatedTestController { /** * @Description @Validated注解测试 * @Author ccm * @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生效了.
源码地址:
您的点赞、收藏、转发和关注是我持续创作的动力!
转载地址:http://uktli.baihongyu.com/