文章目录
-
- 应用场景
- 需要的依赖
- 看代码
- 小结
应用场景
首先,大部分互联网开发接口按照 restful规范去编写,在很多时候,要对接口参数做校验,通常我们实际中是前端先过滤,后端再过滤一次,所有这篇文章主要是针对后端校验的的一些方式
需要的依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
技术细节
-
groups,校验分组,用的比较多的是id参数
@Documented @Constraint(validatedBy = { }) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Repeatable(List.class) public @interface NotBlank { String message() default "{javax.validation.constraints.NotBlank.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; /** * Defines several {@code @NotBlank} constraints on the same element. * * @see NotBlank */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Documented public @interface List { NotBlank[] value(); } }
// 新增操作 public interface Create {} // 更新操作 public interface Update {} // 接口DTO public class User { @NotBlank(groups = Update.class) private Long id; @NotBlank(groups = {Create.class, Update.class}) private String name; /** 忽略set get*/ } // controller 方法 // 创建用户,id不需要,但是名称需要 public User creatUser(@RequestBody @Validated({Create.class} User user) { // DB自增id,创建User } // 更新用户,id需要,但是名称需要 public User creatUser(@RequestBody @Validated({Update.class} User user) { // 使用id,去更新User }
- org.springframework.validation.BindingResult 捕获校验结果
// 前提:我们接口参数中已配置 @NotNull、@NotBlank 等注解 public class User { @NotNull(groups = Upcate.class, message = "id不能为空") private Integer Long; // 注意:如果我们不标注groups,则这个校验在任何时候都会去校验 @NotBlank(message = "名称不能为空") private String name; private String age; } public User creatUser(@RequestBody @Validated({Update.class} User user, BindingResult result) { if (result.hasErrors()) { // 该集合保存检查中的异常信息,这个时候我们就可以自定义的返回,与前端交互参数问题 List<ObjectError> allErrors = result.getAllErrors(); } } // 或者升级一下,我们常见中的方式: 1、RestControllerAdvice 使用加强,全局异常处理 2、在controller注解做切面,自定义通知,比如参数打印、日志记录、参数校验等等
小结
可能这不是最优的方式,但是我认为是一种比较好的交互,当然如果你条件允许,可以构建~高端产品【日志监控+告警】yyds !!!