Java接口项目便捷请求参数校验方法——注解@Valid
在Spring Boot接口项目中使用@Valid注解进行请求参数验证
前言
在我们的接口项目开发中,一涉及到请求参数就免不了要进行参数校验,如果只有一到两个请求参数的话,我们可以直接在controller中通过if else进行校验,那么当参数较多的时候还用if else来校验的话 那代码写出来好像不是很好看的样子,那么为了解决这个问题,让我们的代码更简洁、高效,这里使用@Valid来进行请求参数的校验。
正文
1、引入Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、修改请求参数实体类
在请求参数实体上通过相关注解指定需要校验参数及返回对应的验证信息,直接先看代码
package com.test.demo.entity;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description: 测试实体
* @Author: Olrookie
* @Date: 2023/5/23
*/
@Data
public class TestEntity {
/**
* 参数值
*/
private String strKey;
/**
* 参数值
*/
private String strValue;
/**
* appCode身份验证校验
*/
@NotBlank(message = "参数appCode为必填参数!")
private String appCode;
/**
* 页编号
*/
@NotBlank(message = "参数pageNum,pageSize为必填参数!")
private String pageNum;
/**
* 页大小
*/
@NotBlank(message = "参数pageNum,pageSize为必填参数!")
private String pageSize;
}
这里我们使用@NotBlank来对appCode、pageNum、pageSize三个参数进行校验并注明校验不通过时返回的信息message,这里@NotBlank是指定请求参数不能为null且不能为空,除了@NotBlank之外还有一些其它注解,如下表:
注解 | 描述 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
3、使用注解@Valid,并返回验证失败信息
Controller代码详解
在接口实体类前加上注解@Valid即可进行请求参数验证,那么如果我们想返回验证失败的信息呢? 那我们需要在方法中加上参数BindingResult,用其承接验证失败的信息并返回
下方Controller代码详解: 1、首先我们通过公共方法paramCheck对BindingResult进行判断,判断其是否包含验证失败信息,如果未包含验证失败信息,则进一步验证请求参数appCode是否正确,并返回相关信息(这里跟我们今天讲的内容关系不大,不再进一步说明) 2、如果BindingResult包含验证失败信息则将其返回 3、这里返回内容使用的是统一的CommonResult类
package com.test.demo.controller;
import com.test.cloudapicommons.common.CommonResult;
import com.test.cloudapicommons.entities.BaseInfo;
import com.test.cloudapicommons.entities.ResponseCode;
import com.test.cloudapicommons.utils.JudgeUtils;
import com.test.demo.entity.TestEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* @Description: Demo1测试Controller
* @Author: Olrookie
* @Date: 2023/5/22
*/
@Slf4j
@RestController
@RequestMapping("/api")
public class Demo1Controller {
@GetMapping("/testDemo1")
public CommonResult test(@Valid TestEntity testEntity, BindingResult bindingResult) {
String paramCheckMsg = JudgeUtils.paramCheck(bindingResult);
// 请求参数校验
if ("success".equals(paramCheckMsg)) {
// appCode校验
if (JudgeUtils.identityCheck(testEntity.getAppCode())) {
return new CommonResult(ResponseCode.RESULT_CODE_SUCCESS, BaseInfo.SUCCESS_INFO);
}
log.warn("appCode校验失败! 请求的错误appCode为:{}", testEntity.getAppCode());
return new CommonResult(ResponseCode.RESULT_CODE_FALIER_IDENTITY, "appCode错误!");
}
return new CommonResult(ResponseCode.RESULT_CODE_PARAM_ERROR, paramCheckMsg);
}
}
paramCheck判断方法详解
paramCheck方法先判断BindingResult是否包含验证失败信息,如果包含我这里让其默认返回第一条错误信息,成功则返回"success"
package com.test.cloudapicommons.utils;
import com.test.cloudapicommons.entities.BaseInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
/**
* @Description: 提取用于判断的公共方法
* @Author: Olrookie
* @Date: 2023/5/23
*/
@Slf4j
public class JudgeUtils {
/**
* 判断请求参数appCode是否正确
* @param appCode 身份验证appCode
* @return true/false
*/
public static Boolean identityCheck(String appCode) {
return BaseInfo.APP_CODE.equals(appCode);
}
/**
* 返回实体类校验信息
* @param bindingResult BindingResult
* @return errorMsg/success
*/
public static String paramCheck(BindingResult bindingResult) {
// 通过BinidingResult绑定实体类校验信息
if (bindingResult.hasErrors()) {
// 如果实体类校验出现错误,则返回第一条错误信息的默认msg
String errorMsg = bindingResult.getAllErrors().get(0).getDefaultMessage();
log.warn("请求参数未通过校验:{}", errorMsg);
return errorMsg;
}
return "success";
}
}
统一返回信息
这里封装整个项目统一格式的返回内容,其包含响应码,响应日志以及具体返回内容
package com.test.cloudapicommons.common;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description: 统一给前端参数
* @Author: Olrookie
* @Date: 2023/5/23
*/
@Data
@NoArgsConstructor
public class CommonResult <T> {
/** 响应码 */
private String code;
/** 响应日志 */
private String message;
/** 实体类 */
private T data;
/**
*
* @param code 响应码
* @param message 具体响应日志
*/
public CommonResult(String code, String message) {
this.code = code;
this.message = message;
}
/**
*
* @param code 响应码
* @param message 具体响应日志
* @param data 具体返回的实体类
*/
public CommonResult(String code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
}
4、接口测试
以下是通过ApiPost发送不同参数请求所返回的接口
4.1返回请求参数的验证失败信息
4.2请求成功返回的信息
结语
最近也是刚封装了一个SpringBoot的接口父项目,结合之前接口开发的问题就想到了注解@Valid,于是在这里写下这篇文章以作记录,也希望对大家有所帮助,如果有什么问题还希望大家不吝赐教,多多交流。最后,祝大家变得更强!
转载自:https://juejin.cn/post/7242212342761783333