前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >接口参数注解验证案例

接口参数注解验证案例

作者头像
CBeann
发布2023-12-25 19:06:00
1600
发布2023-12-25 19:06:00
举报
文章被收录于专栏:CBeann的博客CBeann的博客

写作缘由

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

源码下载

ChaiRongD/Demooo - Gitee.com

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

请求参数验证

请求参数不为null

首先定义一个dto

代码语言:javascript
复制
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;
}

写一个测试接口

代码语言:javascript
复制
  @PostMapping("/studentHello")
  public StudentDto studentHello(@Validated @RequestBody StudentDto student) {
    return student;
  }

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

代码语言:javascript
复制
{"id":1,
"email":"email"
}

分组验证

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

首先定义两个接口标志

代码语言:javascript
复制
public class BaseConstant {

  public static interface Insert {}

  public static interface Update {}
}

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

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
@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注解里的参数,那结果就是不做任何校验。

代码语言:javascript
复制
 @PostMapping("/teacherHello")
  public TeacherDto teacherHello(@Validated @RequestBody TeacherDto teacherDto) {
    return teacherDto;
  }

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

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

代码语言:javascript
复制
@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;
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写作缘由
  • 源码下载
  • 请求参数验证
    • 请求参数不为null
      • 分组验证
        • 全局异常捕捉返回友好提示
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档