如何实现 Java SpringBoot 自动验证入参数据的有效性

 Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证
如果碰到 @NotEmpty 否则不生效,注意看下 @RequestBody 前面是否加上了@Valid

Validation常用注解汇总

Constraint详细信息
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@NotBlank被注释的元素不能为空(空格视为空)
@NotEmpty被注释的元素不能为空 (允许有空格)
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Pattern(value)被注释的元素必须符合指定的正则表达式
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期

示例

 /*** 用户名*/@NotBlank(message = "用户名不能为空")private String username;/*** 用户真实姓名*/@NotBlank(message = "用户真实姓名不能为空")private String name;/*** 密码*/@Pattern(regexp = "^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[^A-Za-z0-9]))(?=^[^\\u4e00-\\u9fa5]{0,}$).{8,20}$", message = "密码过于简单有被盗风险,请保证密码大于8位,并且由大小写字母、数字,特殊符号组成")  private String password;/*** 邮箱*/@NotBlank(message = "邮箱不能为空")@Email(message = "邮箱格式不正确")private String email;/*** 手机号*/@NotBlank(message = "手机号不能为空")@Pattern(regexp = "^(1[0-9])\\d{9}$", message = "手机号格式不正确")private String mobile;

Demo

入参对象上,添加注解及说明

package com.vipsoft.web.entity;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;/*** 定时任务调度*/
public class QuartzJob implements Serializable {private static final long serialVersionUID = 1L;/*** 任务序号*/private long jobId;/*** 任务名称*/@NotBlank(message = "任务名称不能为空")@Size(max = 10, message = "任务名称不能超过10个字符")private String jobName;/*** 任务组名*/@NotBlank(message = "任务组名不能为空")@Size(max = 10, message = "任务组名不能超过10个字符")private String jobGroup;/*** 调用目标字符串*/private String invokeTarget;/*** 执行表达式*/private String cronExpression;/*** cron计划策略 0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行*/private String misfirePolicy = "0";/*** 并发执行 0=允许,1=禁止*/private String concurrent;/*** 任务状态(0正常 1暂停)*/private String status;/*** 备注*/private String remark;
}

Controller @RequestBody 前面必须加上 @Valid 否则不生效

import javax.validation.Valid;@RestController
@RequestMapping("schedule")
public class ScheduleController {private Logger logger = LoggerFactory.getLogger(ScheduleController.class);@RequestMapping("/add")public ApiResult addTask(@Valid @RequestBody QuartzJob param) throws Exception {logger.info("添加调度任务 => {} ", JSONUtil.toJsonStr(param));return new ApiResult("添加成功");}
}

异常处理,统一返回对象,方便前端解析
GlobalExceptionHandler

package com.vipsoft.web.exception;import cn.hutool.core.util.StrUtil;
import com.vipsoft.web.utils.ApiResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.List;/*** 全局异常处理器*/
@RestControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理自定义异常*/@ExceptionHandler(CustomException.class)public ApiResult handleException(CustomException e) {// 打印异常信息logger.error("### 异常信息:{} ###", e.getMessage());return new ApiResult(e.getCode(), e.getMessage());}/*** 参数错误异常*/@ExceptionHandler({MethodArgumentNotValidException.class, BindException.class})public ApiResult handleException(Exception e) {if (e instanceof MethodArgumentNotValidException) {MethodArgumentNotValidException validException = (MethodArgumentNotValidException) e;BindingResult result = validException.getBindingResult();StringBuffer errorMsg = new StringBuffer();if (result.hasErrors()) {List<ObjectError> errors = result.getAllErrors();errors.forEach(p -> {FieldError fieldError = (FieldError) p;errorMsg.append(fieldError.getDefaultMessage()).append(",");logger.error("### 请求参数错误:{" + fieldError.getObjectName() + "},field{" + fieldError.getField() + "},errorMessage{" + fieldError.getDefaultMessage() + "}");});return new ApiResult(6001, errorMsg.toString());}} else if (e instanceof BindException) {BindException bindException = (BindException) e;if (bindException.hasErrors()) {logger.error("### 请求参数错误: {}", bindException.getAllErrors());}}return new ApiResult(6001, "参数无效");}/*** 处理HttpRequestMethodNotSupporte异常* @param e* @return*/@ExceptionHandler(HttpRequestMethodNotSupportedException.class)public Object methodHandler(HttpRequestMethodNotSupportedException e) {// 打印异常信息logger.error("### 异常信息:{} ###", e.getMessage());return new ApiResult(6000, e.getMessage());}/*** 处理所有不可知的异常*/@ExceptionHandler(Exception.class)public ApiResult handleOtherException(Exception e) {// 打印异常信息logger.error("### 系统内部错误:{} ###", e.getMessage(), e);String warnMsg = StrUtil.isEmpty(e.getMessage()) ? "### 系统内部错误 ###" : e.getMessage();return new ApiResult(6000, "系统内部错误", e.getMessage());}}

统一返回对像 ApiResult

package com.vipsoft.web.utils;//import com.github.pagehelper.PageInfo;import java.io.Serializable;public class ApiResult implements Serializable {/*** 返回编码 0:失败、1:成功*/private int code;/*** 返回消息*/private String message;/*** 返回对象*/private Object data;/*** 分页对象*/private Page page;public ApiResult() {this.code = 1;this.message = "请求成功";}public ApiResult(Integer code, String message) {this.code = code;this.message = message;}public ApiResult(Integer code, String message, Object data) {this.code = code;this.message = message;this.setData(data);}public ApiResult(Object data) {this.code = 1;this.message = "请求成功";this.setData(data);}//    public ApiResult(PageInfo pageInfo) {
//        this.code = 1;
//        this.message = "请求成功";
//        this.setData(pageInfo.getList());
//        this.setPage(convertToPage(pageInfo));
//    }
//
//    public Page convertToPage(PageInfo pageInfo) {
//        Page result = new Page();
//        result.setTotalCount(pageInfo.getTotal());
//        result.setPageNum(pageInfo.getPageNum());
//        result.setPageCount(pageInfo.getPages());
//        result.setPageSize(pageInfo.getPageSize());
//        result.setPrePage(pageInfo.getPrePage());
//        result.setNextPage(pageInfo.getNextPage());
//        return result;
//    }public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public Page getPage() {return page;}public void setPage(Page page) {this.page = page;}
}

运行结果如下

 

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/58795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB详细安装教程(亲测有效!!)

1.复制以下链接&#xff0c;用百度网盘打开&#xff0c;下载 链接&#xff1a;https://pan.baidu.com/s/19AwQeCRYofGAV8sfDIm5PQ 提取码&#xff1a;mads 我是下载到D盘自己创建的文件中 2.下载完毕后打开此文件夹&#xff0c;点击最后一项 3.点击右上角高级选项&#xff0…

HBase-组成

client 读写请求HMaster 管理元数据监控region是否需要进行负载均衡&#xff0c;故障转移和region的拆分RegionServer 负责数据cell的处理&#xff0c;例如写入数据put&#xff0c;查询数据get等 拆分合并Region的实际执行者&#xff0c;由Master监控&#xff0c;由regionServ…

【MATLAB第65期】基于LSTM长短期记忆网络的多输入单输出数据预测未来思路介绍(短期预测)

【MATLAB第65期】基于LSTM长短期记忆网络的多输入单输出数据预测未来思路介绍&#xff08;短期预测&#xff09; 往期第13期已实现多输入单输出滑动窗口回归预测 多输入单输出滑动窗口回归预测 往期第54期已实现多输入多输出滑动窗口回归预测 多输入多输出滑动窗口回归预测 一…

neo4j终端操作

1】进入容器 (base) xiaokkkxiaokkkdeMacBook-Pro ~ % docker exec -it 77ed5fe2b52e /bin/bash 2】启动、停止neo4j root77ed5fe2b52e:/var/lib/neo4j/bin# ./neo4j start Neo4j is already running (pid:7). Run with --verbose for a more detailed error message.root7…

pycharm离线安装依赖包

一、对于单个下载离线包&#xff0c;然后安装 1、先去https://pypi.org/网站下载离线包&#xff0c;下载到本地&#xff1b; 2、从磁盘中找到刚刚下载包&#xff0c;点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来&#xff0c;然后批量在另一个项目&#xff…

电脑IP地址错误无法上网怎么办?

电脑出现IP地址错误后就将无法连接网络&#xff0c;从而无法正常访问互联网。那么当电脑出现IP地址错误时该怎么办呢&#xff1f; 确认是否禁用本地连接 你需要先确定是否禁用了本地网络连接&#xff0c;如果发现禁用&#xff0c;则将其启用即可。 启用方法&#xff1a;点击桌…

【大数据Hive】Hive 内部表与外部表使用详解

目录 一、hive 内部表简介 1.1 查看内部表信息 二、hive 外部表简介 三、内部表与外部表对比 四、内部表与外部表操作演示 4.1 内部表操作 4.1.1 数据准备 4.1.2 建表sql 4.2 外部表操作 4.2.1 建表sql 4.2.2 上传数据文件到 /stu目录 4.2.3 内部表删除 4.2.4 外部…

角角の Qt学习笔记(一)

目录 一、解决在创建新项目时遇到的几个问题 二、信号和槽&#xff08;非自定义&#xff09; 三、调用 UI 中的元素&#xff08;比如按钮&#xff09; 一、解决在创建新项目时遇到的几个问题 在新建项目时&#xff0c;我选择的构建系统为CMake。然后勾选了Generate form&…

超级浏览器与指纹浏览器:功能与特点的比较

导语&#xff1a;随着互联网的快速发展&#xff0c;隐私和安全问题日益受到关注。在这个背景下&#xff0c;超级浏览器和指纹浏览器作为定制化浏览器的两个重要类型&#xff0c;各自具有独特的功能和特点。本文将对超级浏览器和指纹浏览器进行比较&#xff0c;帮助读者更好地理…

PDF Expert 3.3 for mac

PDF Expert是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 以下是PDF Expert的特点&#xff1a; PDF编辑&#xff1a;PDF Expert提供了丰富的PDF编辑功能&#xff0c;包括添加、删除、移动、旋转、缩放、裁…

vue中vuex的五个属性和基本用法,另加js-cookie的使用

VueX 是一个专门为 Vue.js 应用设计的状态管理构架&#xff0c;统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data )。 Vuex有五个核心概念&#xff1a; state, getters, mutations, actions, modules。 1. state&#xff1a; vuex的基本数据&…

使用Pytest集成Allure生成漂亮的图形测试报告

目录 前言 依赖包安装 Pytest Allure Pytest Adaptor 改造基于Pytest的测试用例 生成测试报告 运行测试 生成测试报告 打开测试报告 资料获取方法 前言 之前写过一篇生成测试报告的博客&#xff0c;但是其实Allure首先是一个可以独立运行的测试报告生成框架&#xff…