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); @Autowired
IQuartzJobService jobService; @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;
}
}

运行结果如下

如何实现 Java SpringBoot 自动验证入参数据的有效性的更多相关文章

  1. SpringBoot注解验证参数

    SpringBoot注解验证参数 废话不多说,直接上表格说明: 注解 作用类型 解释 @NotNull 任何类型 属性不能为null @NotEmpty 集合 集合不能为null,且size大于0 @ ...

  2. Java SpringBoot 如何使用 IdentityServer4 作为验证学习笔记

    这边记录下如何使用IdentityServer4 作为 Java SpringBoot 的 认证服务器和令牌颁发服务器.本人也是新手,所以理解不足的地方请多多指教.另外由于真的很久没有写中文了,用词不 ...

  3. 【转载】JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案

    JAVA SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案 本文为转载,原文地址为:https://www.cnblogs.com/adversary/p/103 ...

  4. java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况

    java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况 邮件短信微服务 spring boot 微服务 接收json格式参数 验证参数合 ...

  5. 【Other】最近在研究的, Java/Springboot/RPC/JPA等

    我的Springboot框架,欢迎关注: https://github.com/junneyang/common-web-starter Dubbo-大波-服务化框架 dubbo_百度搜索 Dubbo ...

  6. Spring Boot之从Spring Framework装配掌握SpringBoot自动装配

    Spring Framework模式注解 模式注解是一种用于声明在应用中扮演“组件”角色的注解.如 Spring Framework 中的 @Repository 标注在任何类上 ,用于扮演仓储角色的 ...

  7. Java SpringBoot使用Redis缓存和Ehcache

    <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http:// ...

  8. 这样讲 SpringBoot 自动配置原理,你应该能明白了吧

    https://juejin.im/post/5ce5effb6fb9a07f0b039a14 前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题 ...

  9. SpringBoot获取http请求参数的方法

    SpringBoot获取http请求参数的方法 原文:https://www.cnblogs.com/zhanglijun/p/9403483.html 有七种Java后台获取前端传来参数的方法,稍微 ...

  10. 小BUG大原理:重写WebMvcConfigurationSupport后SpringBoot自动配置失效

    一.背景 公司的项目前段时间发版上线后,测试反馈用户的批量删除功能报错.正常情况下看起来应该是个小 BUG,可怪就怪在上个版本正常,且此次发版未涉及用户功能的改动.因为这个看似小 BUG 我了解到不少 ...

随机推荐

  1. vue项目部署后页面加载首次很慢的优化方案

    参考: vue项目首次加载特别慢需要怎么配置? 1.看看你的依赖包是不是全局引入的,改为组件内按需引入,可大大降低加载时长.或者将组件引入方式改为cdn引入.需要注意的是,两种引入方式不能共存. 2. ...

  2. 【原创】android 7.0 通知报错 java.lang.SecurityException: You need MANAGE_USERS permission to: check if specified user a managed profile outside your profile group

    项目中在后台发送通知,突然某一天测出在Android 7.0上通知发送失败,那么根据提示,我们尝试加了MANAGE_USERS权限,看起来是个系统级别权限,验证后果然无效.接着在搜索后都无果,似乎大家 ...

  3. C#清空控件的值

    /// 清除容器里面某些控件的值 /// </summary> /// <param name="parContainer">容器类控件</param ...

  4. kg打怪升级

    1.kaggle notebook容易断[continue部署] 2.换预训练模型[提交试试] 3.换fold次数

  5. Python Type Hint中Optional[str]=None和str=None的区别

    Python Type Hint中Optional[str]=None和str=None的区别 1 问题来源 在读到Fluent Python, 2ed Edition, P260时产生了一些疑问: ...

  6. excel编辑受限的密码保护破解

    录制一个宏并且执行: Public Sub 工作表保护密码() Const DBLSPACE As String = vbNewLine & vbNewLine Const AUTHORS A ...

  7. 实验1.SDN拓扑实践

    实验1:SDN拓扑实践 一.基本要求 (一)Mininet运行结果截图 (二) 使用Mininet的命令行生成如下拓扑: 1. 3台交换机,每个交换机连接1台主机,3台交换机连接成一条线. 2. 3台 ...

  8. Graphx二度关系

    import org.apache.spark.graphx._import org.apache.spark.rdd.RDDval vertexArray = Array( (1L, (" ...

  9. superset连接mysql数据

    目前superset的官网没给出windows的安装教程,但是实际操作是可以的,网上有很多教程,再次就不赘述! 本篇随笔是介绍superset如何连接mysql数据源,本人踩坑踩了一整天.=_= ~~ ...

  10. JavaWeb笔记第一弹

    一.MYSQL的安装 1.MYSQL的安装 可以去官网找到与自身计算机向对应的版本进行下载 网址如下: MySQL :: Download MySQL Community Server 2.MYSQL ...