接口参数注解验证案例

简介: 写作缘由 写接口的时候经常会有请求体里某字段不为null的需求;也有使用一个dto对象,但是插入和修改都想使用这个dto,那这样的话判断条件就不一样,因为修改操作必须有ID,所以参数验证还是挺麻烦的。所以写个demo记录一下,亲测可用。

源码下载


ChaiRongD/Demooo - Gitee.com


注意依赖和注解到底是引用的哪个包


请求参数验证


请求参数不为null


首先定义一个dto


package com.example.springbootparamvalidatedemo.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class StudentDto {
  @NotNull(message = "id不能为空")
  private Integer id;
  @NotBlank(message = "name不能为空")
  private String name;
  @NotBlank(message = "email不能为空")
  private String email;
}


写一个测试接口


  @PostMapping("/studentHello")
  public StudentDto studentHello(@Validated @RequestBody StudentDto student) {
    return student;
  }


当请求体为下面时(少name字段),会报错,就不贴错误了


{"id":1,
"email":"email"
}


分组验证


比如经常会有添加和修改某类的需求,其实请求里就是一个字段ID是否需要验证,其实这里是可以复用的,如果我能告诉系统 这个是插入操作,不需要验证ID,这个是修改操作,必须要验证ID,那就爽歪歪了,不过确实有这种骚操作。


首先定义两个接口标志


public class BaseConstant {
  public static interface Insert {}
  public static interface Update {}
}


下面定义dto对象,分别标记什么操作下验证什么字段


public class TeacherDto {
  @NotNull(
      message = "id不能为空",
      groups = {BaseConstant.Update.class})
  private Integer id;
  @NotBlank(
      message = "name不能为空",
      groups = {BaseConstant.Update.class, BaseConstant.Insert.class})
  private String name;
  @NotBlank(
      message = "email不能为空",
      groups = {BaseConstant.Update.class, BaseConstant.Insert.class})
  private String email;
}


下面定义的是接口,其中注意接口的参数前面的注解,这样就能实现根据某个类型判断不同的字段 ,亲测可用,不贴结果了


@PostMapping("/insertTeacherHello")
  public TeacherDto insertTeacherHello(
      @Validated(BaseConstant.Insert.class) @RequestBody TeacherDto teacherDto) {
    return teacherDto;
  }
  @PostMapping("/updateTeacherHello")
  public TeacherDto updateTeacherHello(
      @Validated(BaseConstant.Update.class) @RequestBody TeacherDto teacherDto) {
    return teacherDto;
  }


但是也有一种情况,就是下面这中,我不指定Validated注解里的参数,那结果就是不做任何校验。


 @PostMapping("/teacherHello")
  public TeacherDto teacherHello(@Validated @RequestBody TeacherDto teacherDto) {
    return teacherDto;
  }


全局异常捕捉返回友好提示


上面只能保证接口不会访问到,但是你要返回一个友好的提示,那就需要全局异常捕捉。


@ControllerAdvice
public class AllException {
  @ExceptionHandler(value = Exception.class)
  @ResponseBody
  public String exception(Exception e) {
    return "exception处理错误!" + e.getMessage();
  }
  // 请求接口参数错误会走下面这个方法
  @ExceptionHandler(value = BindException.class)
  @ResponseBody
  public String BindException(BindException e) {
    BindingResult bindingResult = e.getBindingResult();
    String errorMesssage = "";
    for (FieldError fieldError : bindingResult.getFieldErrors()) {
      errorMesssage += fieldError.getDefaultMessage() + "!";
    }
    return "BindException处理错误!" + errorMesssage;
  }
}
目录
相关文章
|
1月前
|
JSON 前端开发 Java
SpringBoot 的优雅的接口参数验证
1. 为什么需要参数验证 在应用程序的开发中,我们经常会遇到需要保证传入参数的正确性的情况。例如,当我们在注册用户时,需要验证用户填写的表单数据是否符合规范,是否缺少必填字段,或者格式是否正确,等等。如果不对参数进行验证,我们的应用程序可能会因此受到攻击或者运行出错。 为了保证参数的正确性,我们需要使用参数验证机制,来检测并处理传入的参数格式是否符合规范。 2. 如何进行参数验证 Spring Boot内置了一个很强大的参数验证框架——JSR 303 Bean Validation 标准,它可以对我们的实体类参数进行校验,并且可以给我们提供详细的错误提示信息。
81 1
|
9月前
|
Java 数据库连接 Spring
JavaWeb优雅实现接口参数校验
JavaWeb优雅实现接口参数校验
86 0
|
8月前
|
数据安全/隐私保护
fastadmin中写接口是时Validate规则验证自定义如何用
fastadmin中写接口是时Validate规则验证自定义如何用
|
10月前
|
关系型数据库 MySQL 数据安全/隐私保护
nest自定义验证类及自定义验证装饰器
nest自定义验证类及自定义验证装饰器
|
11月前
|
Java 数据安全/隐私保护
使用反射实现@RequestBody的参数校验功能
springboot中对实体类参数中属性进行校验一般都是使用javax.validation中提供的注解
|
Java API
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
296 7
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
AOP + 注解 实现通用的接口参数校验
写移动端接口的时候,为了校验参数,传统的做法是加各种判断,写了很多重复的代码,而且也不美观。为了增加代码复用性,美观的校验参数,采用AOP + 注解的方式来实现接口的参数校验(使用拦截器也可以实现),在需要校验参数的方法上加上自定义的注解即可。
257 0
AOP + 注解 实现通用的接口参数校验
|
XML SQL JSON
接口自动化测试,一键快速校验接口返回值全部字段
在日常开展自动化测试工作时,为了保证接口测试的有效性,少不了要对接口返回的响应字段进行校验、断言等操作。当接口返回的字段数量本身就很少时,接口断言操作一般都很容易就能实现,但当接口的返回字段特别多,结构特别复杂时,例如响应字段数量达到了成百上千时,如何快速实现全部返回字段的校验?
517 0
接口自动化测试,一键快速校验接口返回值全部字段
|
前端开发 Java Spring
基于SpringBoot参数校验器拓展自定义参数校验
想必工作中大家为了保证接口的稳定性与安全性都会对入参进行校验。五花八门的校验写法会让我们的代码不够整洁,本文将介绍如何使用SpringBoot为我们提供的参数校验器,并对其进行扩展,让其能够实现自定义校验。当然在一些互联网项目中,为保证接口的高性能,校验都是放在前端做的,但是在阿里开发规约中是这样说的越是简单的接口越不需要进行参数校验,越是复杂的接口越需要参数校验,因为复杂的接口试错成本很高,校验对接口性能的影响微乎其微。
295 0
|
Java Spring
自定义注解实现方式解析
自定义注解实现方式解析
217 0
自定义注解实现方式解析