用SpringCloud Alibaba搭建属于自己的微服务(九)~基础搭建~参数校验框架的使用

一.概述

在我们设计接口时,往往在逻辑最开始的地方,我们首先面临的就是参数校验,之后才是整体的业务逻辑实现.例如,通过手机号和验证码实现注册功能的接口,首先需要做的就是对手机号进行正则校验,验证码的长度是否正确.在我们引入参数校验框架之后,这些事情可以不用编码,直接使用注解就能完成参数校验框架了.

二.使用

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哈哈~)

猜你喜欢

转载自blog.csdn.net/theOldCaptain/article/details/107246521