接口参数注解验证案例

简介: 写作缘由 写接口的时候经常会有请求体里某字段不为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;
  }
}
目录
相关文章
|
9月前
|
JSON 前端开发 Java
SpringBoot 的优雅的接口参数验证
1. 为什么需要参数验证 在应用程序的开发中,我们经常会遇到需要保证传入参数的正确性的情况。例如,当我们在注册用户时,需要验证用户填写的表单数据是否符合规范,是否缺少必填字段,或者格式是否正确,等等。如果不对参数进行验证,我们的应用程序可能会因此受到攻击或者运行出错。 为了保证参数的正确性,我们需要使用参数验证机制,来检测并处理传入的参数格式是否符合规范。 2. 如何进行参数验证 Spring Boot内置了一个很强大的参数验证框架——JSR 303 Bean Validation 标准,它可以对我们的实体类参数进行校验,并且可以给我们提供详细的错误提示信息。
161 1
|
Java 数据库连接 Spring
JavaWeb优雅实现接口参数校验
JavaWeb优雅实现接口参数校验
153 0
|
前端开发 JavaScript Java
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回
本篇将要学习 Spring Boot 统一功能处理模块,这也是 AOP 的实战环节 用户登录权限的校验实现接口 HandlerInterceptor + WebMvcConfigurer 异常处理使用注解 @RestControllerAdvice + @ExceptionHandler 数据格式返回使用注解 @ControllerAdvice 并且实现接口 @ResponseBodyAdvice
900 0
|
消息中间件 JavaScript 小程序
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 下
|
Java API
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
341 7
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
|
JavaScript 前端开发 小程序
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 上
SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回 上
AOP + 注解 实现通用的接口参数校验
写移动端接口的时候,为了校验参数,传统的做法是加各种判断,写了很多重复的代码,而且也不美观。为了增加代码复用性,美观的校验参数,采用AOP + 注解的方式来实现接口的参数校验(使用拦截器也可以实现),在需要校验参数的方法上加上自定义的注解即可。
329 0
AOP + 注解 实现通用的接口参数校验
|
前端开发 Java Spring
基于SpringBoot参数校验器拓展自定义参数校验
想必工作中大家为了保证接口的稳定性与安全性都会对入参进行校验。五花八门的校验写法会让我们的代码不够整洁,本文将介绍如何使用SpringBoot为我们提供的参数校验器,并对其进行扩展,让其能够实现自定义校验。当然在一些互联网项目中,为保证接口的高性能,校验都是放在前端做的,但是在阿里开发规约中是这样说的越是简单的接口越不需要进行参数校验,越是复杂的接口越需要参数校验,因为复杂的接口试错成本很高,校验对接口性能的影响微乎其微。
375 0
|
XML Java 数据格式
SpringBoot加Lambda进行参数校验的一个通用方案
SpringBoot加Lambda进行参数校验的一个通用方案
435 0
SpringBoot加Lambda进行参数校验的一个通用方案

热门文章

最新文章