Valid注解使用及扩展
扩展 使用 注解 valid
2023-06-13 09:15:28 时间
@Valid注解使用及扩展
一、@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 |
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)请求进行测试
相关文章
- CListCtrl 扩展风格设置方法—SetExtendedStyle和ModifyStyleEx
- 【说站】php安装grpc扩展的方法
- Flask扩展使用笔记
- 详解CAN总线:标准数据帧和扩展数据帧
- 聊聊如何基于spring @Cacheable扩展实现缓存自动过期时间以及即将到期自动刷新
- JMeter 扩展开发:BeanShell 数据模拟实现及性能探讨
- VSCode 最好的 Python 扩展,可大大提升你的生产力
- php7使用curl扩展「建议收藏」
- 数值的扩展
- Nginx Lua扩展模块
- 使用 Spring Cloud Data Flow 扩展自定义应用程序和任务(二)
- SkeyeRTMPClient扩展支持HEVC(H.265)解决方案之HEVCDecoderConfigurationRecord结构详解
- 安装Linux环境的PHP扩展指南(linux安装php扩展)
- 横向扩展MySQL 分库技术实现横向扩展(mysql分库实现)
- 如何在Ubuntu 11.10安装和管理使用扩展Gnome-Shell主题?
- Oracle RAC扩展:确保可伸缩性及可靠性(oracle扩展rac)
- Linux扩容根分区:为你拓展更大的空间(linux扩展根分区)
- 如何在 Linux 中使用 LVM 创建和扩展交换分区
- 使用Linux下PDO扩展开发数据库应用(linuxpdo扩展)
- php中使用Redis:更快更灵活的缓存实现(redis的php扩展)
- jQuery扩展对input的一些操作方法
- 扩展JavaScript功能的正确方法(译文)
- 用C实现PHP扩展Image_Tool图片常用处理工具类的使用
- oracle分区表之hash分区表的使用及扩展