WEB 接口参数校验

文章目录

    • 应用场景
    • 需要的依赖
    • 看代码
    • 小结

应用场景

首先,大部分互联网开发接口按照 restful规范去编写,在很多时候,要对接口参数做校验,通常我们实际中是前端先过滤,后端再过滤一次,所有这篇文章主要是针对后端校验的的一些方式

需要的依赖

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

技术细节

  1. 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
    }

  2.  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 !!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值