使用@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 List exception(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; }

使用@RequestBody配合@Valid校验入参参数
文章图片

结合统一异常处理,处理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(); List allErrors = bindingResult.getAllErrors(); allErrors.forEach(objectError -> {FieldError fieldError = (FieldError) objectError; String oneMsg = fieldError.getDefaultMessage(); msg.append(oneMsg); msg.append("; "); }); return msg.toString(); } }}

【使用@RequestBody配合@Valid校验入参参数】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    推荐阅读