一、添加依赖
为了避免不必要的错误,可以直接添加如下依赖
<!-- begin --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.0.Final</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b11</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>6.1.0.Final</version> </dependency> <!-- end -->
搞一个异常捕捉类,一个接口响应类
ValidatedExceptionHandler
package com.example.test05.demo.handler; import com.example.test05.demo.tool.JsonData; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; 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.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import java.util.List; /** * @author DBC */ @Slf4j @ControllerAdvice public class ValidatedExceptionHandler { /** * 处理@Validated参数校验失败异常 * @param exception 异常类 * @return 响应 */ @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public JsonData exceptionHandler(MethodArgumentNotValidException exception){ BindingResult result = exception.getBindingResult(); StringBuilder stringBuilder = new StringBuilder(); if (result.hasErrors()) { List<ObjectError> errors = result.getAllErrors(); if (errors != null) { errors.forEach(p -> { FieldError fieldError = (FieldError) p; log.warn("Bad Request Parameters: dto entity [{}],field [{}],message [{}]",fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage()); stringBuilder.append(fieldError.getDefaultMessage()); }); } } return JsonData.buildError(stringBuilder.toString()); } }
JsonData
package com.example.test05.demo.tool; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor public class JsonData implements Serializable { /** * 状态码 0 表示成功 */ private Integer code; /** * 数据 */ private Object data; /** * 描述 */ private String msg; /** * 成功,不传入数据 * @return */ public static JsonData buildSuccess() { Date day=new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return new JsonData(0, df.format(day), "成功"); } /** * 成功,传入数据 * @param data * @return */ public static JsonData buildSuccess(Object data) { return new JsonData(0, data, "成功"); } /** * 失败,传入描述信息 * @param msg * @return */ public static JsonData buildError(String msg) { Date day=new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return new JsonData(-1, df.format(day), msg); } /** * 自定义状态码和错误信息 * @param code * @param msg * @return */ public static JsonData buildCodeAndMsg(int code, String msg) { Date day=new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return new JsonData(code, df.format(day), msg); } }
大功告成,可以开始测试了!
一、测试姓名不能为空
@NotBlank(message = "姓名不能为空!") private String name;
/** * 姓名不能为空 * @param userDO * @return */ @PostMapping("testNameValidated") public JsonData testNameValidated(@Validated @RequestBody TbUserDO userDO) { return JsonData.buildSuccess(userDO); }
效果如下
二、测试年龄的校验
@Min(value = 1, message = "年龄不能小于1!") @Max(value = 120, message = "年龄不能大于120!") private String age;
/** * 年龄的控制 * @param userDO * @return */ @PostMapping("testAgeValidated") public JsonData testAgeValidated(@Validated @RequestBody TbUserDO userDO) { return JsonData.buildSuccess(userDO); }
效果如下
三、嵌套测试
@NotBlank(message = "姓名不能为空!") @Valid private String name; @Min(value = 1, message = "年龄不能小于1!") @Max(value = 120, message = "年龄不能大于120!") @Valid private String age;
/** * 综合测试 * @param userDO * @return */ @PostMapping("testValidated") public JsonData testValidated(@Validated @RequestBody TbUserDO userDO) { return JsonData.buildSuccess(userDO); }
效果如下
附加内容
以下图片源自https://blog.csdn.net/sunnyzyq/article/details/103527380
重点,额外知识
我们如果在Controller层就想直接校验,那么在使用如下的方法即可
顶部直接加入
@Validated
@RequestParam() @NotNull(message = "ID不可以为空")
本文作者为DBC,转载请注明。