使用@RequestBody配合@Valid校验入参参数
目录
- @RequestBody配合@Valid校验入参参数
- 自定义一个Controller
- 自定义实体类
- 自定义全局异常处理器
- 附录
- @Valid校验@RequestBody的参数
- 希望通过注解校验post请求的body
- 在request实体类添加注解进行校验
- 可以返回注解配置的错误信息
@RequestBody配合@Valid校验入参参数
自定义一个Controller
import com.example.demo.pojo.User; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; /** * @Author: luoye * @Date: 2018-10-12 */@RestControllerpublic class ValiController {@PostMapping(value = "https://www.it610.com/",produces = "application/json; charset=UTF-8")public User vali(@RequestBody @Valid User user){return user; }}
自定义实体类
import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @Author: luoye * @Date: 2018-10-12 */public class User {@NotBlank(message = "这个姓名不能为空")private String name; @NotNull(message = "这个年龄不能为空")@Max(value = https://www.it610.com/article/105,message ="太大了")private Integer age; public String getName() {return name; } public void setName(String name) {this.name = name; } public Integer getAge() {return age; } public void setAge(Integer age) {this.age = age; }}
自定义全局异常处理器
import com.example.demo.pojo.ErrorMsg; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ResponseBody; import java.util.ArrayList; import java.util.List; /** * @Author luoye * @Date: 2018/10/12 16:50 */@ControllerAdvicepublic class ExceptionHandlerContrller { @ExceptionHandler(MethodArgumentNotValidException.class)@ResponseBodypublic Listexception(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult(); List allErrors = bindingResult.getAllErrors(); List errorMsgs = new ArrayList<>(); allErrors.forEach(objectError -> {ErrorMsg errorMsg = new ErrorMsg(); FieldError fieldError = (FieldError)objectError; errorMsg.setField(fieldError.getField()); errorMsg.setObjectName(fieldError.getObjectName()); errorMsg.setMessage(fieldError.getDefaultMessage()); errorMsgs.add(errorMsg); }); return errorMsgs; }}
PostMan测试下
[{"field": "name","message": "这个姓名不能为空","objectName": "user"},{"field": "age","message": "这个年龄不能为空","objectName": "user"}]
附录
@Valid 注解类型的使用:
@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
:验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
@Valid校验@RequestBody的参数
希望通过注解校验post请求的body
需要用到@Valid注解
public String getResponse(@RequestBody @Valid MyRequest request) throws Exception { xxx}
在request实体类添加注解进行校验
例如用@NotNull进行判空校验
@Datapublic class MyRequest {@NotNull(message = "id 不能为空")private Integer id; @NotNull(message = "name 不能为空")private String name; }
文章图片
结合统一异常处理,处理MethodArgumentNotValidException
可以返回注解配置的错误信息
@ControllerAdvice@Slf4jpublic class ExceptionResolver {@ExceptionHandler(value = https://www.it610.com/article/{Exception.class})@ResponseBodypublic String handleOtherExceptions(final Exception ex) {if (ex instanceof MethodArgumentNotValidException) {// 入参校验错误StringBuilder msg = new StringBuilder(); MethodArgumentNotValidException mex = (MethodArgumentNotValidException) ex; BindingResult bindingResult = mex.getBindingResult(); ListallErrors = bindingResult.getAllErrors(); allErrors.forEach(objectError -> {FieldError fieldError = (FieldError) objectError; String oneMsg = fieldError.getDefaultMessage(); msg.append(oneMsg); msg.append("; "); }); return msg.toString(); } }}
【使用@RequestBody配合@Valid校验入参参数】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- ESP32|基于arduino的ESP32 学习笔记(二) TFT_eSPI和LVGL库使用笔记
- MyBatis-Plus|Springboot(使用IDEA自动生成java实体类Mysql逆向工程效率神器使用讲解)
- java|java socket 通信协议_使用java如何实现基于TCP协议网络socket编程
- 人工智能+大数据|逻辑回归(使用激活函数sigmoid)详细介绍
- 目标检测|yolov5——断点训练/继续训练【解决方法、使用教程】
- 目标检测|yolov5——detect.py代码【注释、详解、使用教程】
- POSTMAN从入门到精通系列(二十六)(使用标签)
- 学习笔记|如何使用PyCharm对函数进行测试
- java后端|spring boot使用druid多数据源配置
- 使用Minio遇见的一些坑