@Vaild注解使用及扩展

一、@Vaild注解介绍

使用@Vaild注解可以简化入参的校验,配合统一异常实现简单快捷的入参校验,具体使用参照以下

二、@Vaild具体使用

1、引入jar包

如果你是springboot项目,此依赖内已经引入,无需再次引入

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>

如果没有,将依赖jar包引入到自己的项目中,maven依赖如下

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.5.Final</version>
</dependency>

2、在入参请求类中添加限制注解

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range; import javax.validation.constraints.NotNull;
import java.io.Serializable; @Data
@NoArgsConstructor
@AllArgsConstructor
public class UserReq implements Serializable { private Integer id; @NotBlank(message = "用户名不能为空")
@Length(message = "用户名最大为{max}个字符", max = 20)
private String username; @NotBlank(message = "密码不能为空")
@Length(message = "密码长度限制为{min}-{max}", min = 8, max = 16)
private String password; @NotNull(message = "性别不能为空")
private Byte sex; @Range(message = "年龄范围为{min}-{max}", min = 0, max = 120)
private Integer age; }

3、控制器中使用@Vaild

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController { @PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req){
log.info(JSON.toJSONString(req));
return "成功";
} }

4、请求进行测试

虽然拦截成功,但错误出参不知道所以然,一头雾水,需进行优化

三、优化出参

1、修改控制器

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController { @PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req, BindingResult result){
// 如果发生错误,则返回第一个错误信息,这里也可以自定义返回信息
if(result.hasErrors()){
String message = result.getAllErrors().get(0).getDefaultMessage();
log.error(message);
return message;
}
log.info(JSON.toJSONString(req));
return "成功";
} }

2、请求进行测试

四、使用统一异常

1、创建统一异常捕获类

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; @Slf4j
@ControllerAdvice
public class MyExceptionHandler { @ResponseBody
@ExceptionHandler(Exception.class)
public ResultData exceptionHandler(Exception exception){
log.error("统一异常", exception);
// 捕获对应异常进行处理,默认返回第一个错误信息,这里也可以自定义返回信息
if(exception instanceof MethodArgumentNotValidException){
MethodArgumentNotValidException ex = (MethodArgumentNotValidException) exception;
String message = ex.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return ResultData.getFailResult(message);
}
return ResultData.getFailResult("服务器繁忙,请稍后再试!");
} }

2、此时控制器不需要做额外处理

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @Slf4j
@RestController
@RequestMapping("/user/post")
public class PostController { @PostMapping("/create")
public String createUser(@Valid @RequestBody UserReq req){
log.info(JSON.toJSONString(req));
return "成功";
} }

3、请求进行测试

五、验证注解

1、官方的验证注解

验证注解 说明
@Null 只能为null
@NotNull 不能为null
@NotEmpty 不为null、不能为空字符串(字符串长度不为0、集合大小不为0)
@NotBlank 不为null、不能为空字符串,不同于@NotEmpty,@NotBlank会去掉空格再判断
@AssertFalse 必须为false
@AssertTrue 必须为true
@DecimalMax(value) 必须为一个不大于指定值的数字
@DecimalMin(value) 必须为一个不小于指定值的数字
@Max(value) 必须为一个不大于指定值的数字
@Min(value) 必须为一个不小于指定值的数字
@Digits(integer,fraction) 必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 必须是一个将来的日期
@Past 必须是一个过去的日期
@Pattern(value) 必须符合指定的正则表达式
@Length(max,min) 字符长度必须在min到max之间
@Email 验证注解的元素值是Email

2、自定义验证注解

1)定义注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Constraint(validatedBy = {SexConstraintValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SexConstraint { String message() default "性别有误,请确认"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }

2)定义校验器

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; public class SexConstraintValidator implements ConstraintValidator<SexConstraint, Byte> { @Override
public void initialize(SexConstraint sexConstraint) {
System.out.println("初始化信息");
} @Override
public boolean isValid(Byte sex, ConstraintValidatorContext constraintValidatorContext) {
if(sex==null)
return false;
if(sex!=0 && sex!=1 && sex!=2)
return false;
return true;
} }

3)使用注解

import com.banmoon.lol.config.annotation.SexConstraint;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range; import java.io.Serializable; @Data
@NoArgsConstructor
@AllArgsConstructor
public class UserReq implements Serializable { private Integer id; @NotBlank(message = "用户名不能为空")
@Length(message = "用户名最大为{max}个字符", max = 20)
private String username; @NotBlank(message = "密码不能为空")
@Length(message = "密码长度限制为{min}-{max}", min = 8, max = 16)
private String password; @SexConstraint
private Byte sex; @Range(message = "年龄范围为{min}-{max}", min = 0, max = 120)
private Integer age; }

4)请求进行测试

功能:@Vaild注解使用及扩展的更多相关文章

  1. 【Spring】的【Bean】管理(注解)【四个相同功能的注解】

    [Spring]的[Bean]管理(注解)[四个相同功能的注解] 注解:代码里面特殊的标记,使用注解也可以完成一些相关的功能. 注解写法:@注解名称(属性名称=属性值) 注解使用在类.方法.属性上面 ...

  2. 从头认识Spring-3.8 简单的AOP日志实现(注解版)-扩展添加检查订单功能,以便记录并检測输入的參数

    这一章节我们讨论一下扩展添加检查订单功能,以便记录并检測输入的參数. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03 ...

  3. SFC20 功能例子 注解

    谁能够把这注解一下,给大家分享一下,谢谢了 LAR1  P##SOURCE       L     B#16#10       T     LB [AR1,P#0.0]       L     B#1 ...

  4. 如何编写 Cloud9 JavaScript IDE 的功能扩展

    上周末我们在JSConf.eu发布了 Cloud9 IDE ,同时发布了对应的GitHub项目.在4天时间里该项目得到340个人的关注和将近50个fork.Cloud9的口号是由"由Java ...

  5. 基于AOP注解实现业务功能的动态配置

    一.导入jar包 <dependency><!-- 4.引入AOP--> <groupId>org.springframework.boot</groupId ...

  6. jdk8的扩展注解

    对于注解(也被称做元数据),Java 8 主要有两点改进:类型注解和重复注解. 1.类型注解 1)Java 8 的类型注解扩展了注解使用的范围. 在java 8之前,注解只能是在声明的地方所使用,ja ...

  7. Dubbo源码剖析六之SPI扩展点的实现之Adaptive功能实现原理

    接Dubbo源码剖析六之SPI扩展点的实现之getExtensionLoader - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)继续分析Adaptive功能实现原理.Adaptive的主 ...

  8. Smartbi扩展性怎么样,是否方便扩展开发产品已有功能?

    Smartbi大数据分析工具具有很强的扩展性,通过"稳定内核+API扩展"的架构,通过报表插件扩展的方式,能满足很多应用项目的定制化需求,把新功能无缝集成到系统中. Smartbi ...

  9. iOS开源项目MobileProject功能点介绍

    一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileP ...

随机推荐

  1. 5G组网方案:NSA和SA

    目录 5G组网的8个选项 独立组网(SA) 选项1 选项2 选项5 选项6 总结 非独立组网(NSA) 选项3系列 选项3 选项3a 选项3x 选项7系列 选项4系列 选项8 演进路线 5G组网的8个 ...

  2. springmvc字符 中文乱码问题

    springmvc字符 中文乱码问题 1.字符过滤器 输入中文测试,发现乱码 以前乱码问题通过过滤器解决 , 而SpringMVC给我们提供了一个过滤器 , 可以在web.xml中配置,修改了xml文 ...

  3. #String类简述(小白理解,小白编写,欢迎大神指点,小白跪谢)

    @ 目录 一.前言(可忽略) 二.String变量的认知 三.String类的构造方法 四.String类的基本方法 4.1 toString()方法 4.2 equals()方法 4.3 equal ...

  4. (十三)数据库查询处理之QueryExecution(2)

    (十三)数据库查询处理之QueryExecution(2) 实验室这一周真的忙爆(虽然都是各种打杂的活)所以拖了很久终于在周末(摸鱼)把实验3做完了.同时准备把和查询这一块有关的博客补一下.然后就进入 ...

  5. CVE-2019-10758-Mongo-express-远程代码执行

    漏洞分析 https://xz.aliyun.com/t/7056 漏洞简介 mongo-express是一款mongodb的第三方Web界面,使用node和express开发. 如果攻击者可以成功登 ...

  6. Fcitx5 上线 FreeBSD

    Fcitx5 上线 FreeBSD textproc/fcitx5textproc/fcitx5-qttextproc/fcitx5-gtktextproc/fcitx5-configtoolchin ...

  7. python基础学习之列表的功能方法

    列表:list 格式 li = [1,2,3,4,5,6] 列表内部随意嵌套其他格式:字符串.列表.数字.元组.字典. 列表内部有序,且内容可更改 a = [1,2,3,4]    a[0] = 5  ...

  8. webpack核心模块tapable用法解析

    前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...

  9. UML类图画法整理

    一 类图画法 1.类图的概念 显示出类.接口以及他们的静态结构和关系,用于描述系统的结构化设计. 2.类 类是对一组具有相同属性.操作.关系和语义对象的抽象,是面向对象的核心,包括名称.属性和方法.如 ...

  10. filecoin今日价格,filecoin币价估值,filecoin币会涨到多少钱

    filecoin今日价格,截止 2021 年 3 月 17 日 9 时,filecoin价格为 63.8939 美元,约合人民币 415.69 元.流通市值约 416.2 亿人民币,总市值达到 831 ...