广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot进行参数校验的方法详解
  • 348
分享到

SpringBoot进行参数校验的方法详解

2024-04-02 19:04:59 348人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录介绍1.SpringBoot中集成参数校验1.1引入依赖1.2定义参数实体类1.3定义校验类进行测试1.4打开接口文档模拟提交数据2.参数异常加入全局异常处理器3.自定义参数校验

介绍

在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数进行校验,例如登录的时候需要校验用户名和密码是否为空,添加用户的时候校验用户邮箱地址、手机号码格式是否正确。 靠代码对接口参数一个个校验的话就太繁琐了,代码可读性极差。

Validator框架就是为了解决开发人员在开发的时候少写代码,提升开发效率;Validator专门用来进行接口参数校验,例如常见的必填校验,email格式校验,用户名必须位于6到12之间等等。

接下来我们看看在springbBoot中如何集成参数校验框架。

1.SpringBoot中集成参数校验

1.1引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

1.2定义参数实体类

package com.didiplus.modules.sys.domain;

import io.swagger.annotations.apiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;



@Data
@ApiModel(value = "字典类型")
public class SysDictType {

    @ApiModelProperty("ID")
    private String id;

    @NotBlank(message = "字典名称必填项")
    @ApiModelProperty(value = "字典名称",example = "用户ID")
    private String typeName;

    @NotBlank(message = "字典编码不能为空")
    @ApiModelProperty(value = "字典编码")
    private String typeCode;

    @Email(message = "请填写正确的邮箱地址")
    @ApiModelProperty(value = "字典编码")
    private String email;

    @ApiModelProperty(value = "字典描述")
    private String description;

    @NotBlank(message = "字典状态不能为空")
    @ApiModelProperty(value = "字典状态")
    private String enable;
}

常见的约束注解如下:

注解功能
@AssertFalse可以为null,如果不为null的话必须为false
@AssertTrue可以为null,如果不为null的话必须为true
@DecimalMax设置不能超过最大值
@DecimalMin设置不能超过最小值
@Digits设置必须是数字且数字整数的位数和小数的位数必须在指定范围内
@Future日期必须在当前日期的未来
@Past日期必须在当前日期的过去
@Max最大不得超过此最大值
@Min最大不得小于此最小值
@NotNull不能为null,可以是空
@Null必须为null
@Pattern必须满足指定的正则表达式
@Size集合数组、map等的size()值必须在指定范围内
@Email必须是email格式
@Length长度必须在指定范围内
@NotBlank字符串不能为null,字符串trim()后也不能等于""
@NotEmpty不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于""
@Range值必须在指定范围内
@URL必须是一个URL

1.3定义校验类进行测试

package com.didiplus.modules.sys.controller;

import com.didiplus.modules.sys.domain.SysDictType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import org.springframework.validation.annotation.Validated;
import org.springframework.WEB.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@Api(tags = "数据字典")
@RequestMapping("/api/sys/dictType")
public class SysDictTypeController {

    @ApiOperation("字典添加")
    @PostMapping("/add")
    public SysDictType add(@Validated @RequestBody SysDictType sysDictType) {
        return  sysDictType;
    }

    @ApiOperation("字典修改")
    @PutMapping("/edit")
    public SysDictType edit(@Validated @RequestBody SysDictType sysDictType) {
        return  sysDictType;
    }


}

这里我们先定义两个方法add,edit,都是使用了 @RequestBody注解,用于接受前端发送的JSON数据。

1.4打开接口文档模拟提交数据

通过接口文档看到前三个字段都是必填项。

由于email的格式不对就被拦截了,提示是因为邮箱地址不对。

2.参数异常加入全局异常处理器

虽然我们之前定义了全局异常拦截器,也看到了拦截器确实生效了,但是Validator校验框架返回的错误提示太臃肿了,不便于阅读,为了方便前端提示,我们需要将其简化一下。

直接修改之前定义的 RestExceptionHandler,单独拦截参数校验的三个异常:

javax.validation.ConstraintViolationException

org.springframework.validation.BindException

org.springframework.web.bind.MethodArgumentNotValidException

代码如下:

package com.didiplus.common.web.response.Handler;

import com.didiplus.common.web.response.Result;

import org.springframework.Http.httpstatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;

import java.util.stream.Collectors;


@RestControllerAdvice
public class RestExceptionHandler {
    
    @ExceptionHandler(value = {BindException.class, ValidationException.class, MethodArgumentNotValidException.class})
    public ResponseEntity<Result<String>> handleValidatedException(Exception e) {
            Result<String>  result = null;
            if (e instanceof  MethodArgumentNotValidException) {
                MethodArgumentNotValidException ex =(MethodArgumentNotValidException)  e;
                result = Result.failure(HttpStatus.BAD_REQUEST.value(),
                                ex.getBindingResult().getAllErrors().stream()
                                        .map(ObjectError::getDefaultMessage)
                                        .collect(Collectors.joining(";"))
                                );
            } else  if (e instanceof ConstraintViolationException){
                ConstraintViolationException ex = (ConstraintViolationException) e;
                result = Result.failure(HttpStatus.BAD_REQUEST.value(),
                                        ex.getConstraintViolations().stream()
                                                .map(ConstraintViolation::getMessage)
                                                .collect(Collectors.joining(";"))
                                        );
            }else  if (e instanceof BindException) {
                BindException  ex = (BindException ) e;
                result = Result.failure(HttpStatus.BAD_REQUEST.value(),
                                        ex.getAllErrors().stream()
                                                .map(ObjectError::getDefaultMessage)
                                                .collect(Collectors.joining(";"))
                                        );
            }
            return new ResponseEntity<>(result,HttpStatus.BAD_REQUEST);
    }
}

美化之后错误信息提示更加友好

3.自定义参数校验

虽然Spring Validation 提供的注解基本上够用,但是面对复杂的定义,我们还是需要自己定义相关注解来实现自动校验。
比如上面实体类中添加的sex性别属性,只允许前端传递传 M,F 这2个枚举值,如何实现呢?

3.1创建自定义注解

package com.didiplus.common.annotation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Repeatable(EnumString.List.class)
@Documented
@Constraint(validatedBy = EnumStringValidator.class)//标明由哪个类执行校验逻辑
public @interface EnumString {

    String message() default "value not in enum values.";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] palyload() default {};
    
    String[] value();

    
    @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
    @Retention(RUNTIME)
    @Documented
    @interface List {

        EnumString[] value();
    }


}

3.2自定义校验逻辑

package com.didiplus.common.annotation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;



public class EnumStringValidator implements ConstraintValidator<EnumString,String> {
    private List<String> enumStringList;

    @Override
    public void initialize(EnumString constraintAnnotation) {
        enumStringList = Arrays.asList(constraintAnnotation.value());

    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if(value == null) {
            return true;
        }
        return enumStringList.contains(value);
    }
}

3.3在字段上增加注解

    @ApiModelProperty(value = "性别")
    @EnumString(value = {"F","M"}, message="性别只允许为F或M")
    private String sex;

3.4体验效果

4.分组校验

一个对象在新增的时候某些字段是必填,在更新是有非必填。如上面的 SysDictTypeid 属性在新增操作时都是必填。 面对这种场景你会怎么处理呢?

其实 Validator校验框架已经考虑到了这种场景并且提供了解决方案,就是分组校验。 要使用分组校验,只需要三个步骤:

4.1定义分组接口

package com.didiplus.common.base;

import javax.validation.groups.Default;


public interface ValidGroup extends Default {

    interface Crud extends ValidGroup{
        interface Create extends Crud{

        }

        interface Update extends Crud{

        }

        interface Query extends Crud{

        }

        interface Delete extends Crud{

        }
    }
}

4.2在模型中给参数分配分组

    @Null(groups = ValidGroup.Crud.Create.class)
    @NotNull(groups = ValidGroup.Crud.Update.class,message = "字典ID不能为空")
    @ApiModelProperty("ID")
    private String id;

4.3体现效果

以上就是SpringBoot进行参数校验的方法详解的详细内容,更多关于SpringBoot参数校验的资料请关注编程网其它相关文章!

--结束END--

本文标题: SpringBoot进行参数校验的方法详解

本文链接: https://www.lsjlt.com/news/147530.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot进行参数校验的方法详解
    目录介绍1.SpringBoot中集成参数校验1.1引入依赖1.2定义参数实体类1.3定义校验类进行测试1.4打开接口文档模拟提交数据2.参数异常加入全局异常处理器3.自定义参数校验...
    99+
    2022-11-13
  • SpringBoot如何进行参数校验实例详解
    目录前言为什么需要参数校验SpringBoot中集成参数校验第一步,引入依赖第二步,定义要参数校验的实体类第三步,定义校验类进行测试第四步,体验效果参数异常加入全局异常处理器体验效果...
    99+
    2022-11-13
  • SpringBoot 中使用 Validation 校验参数的方法详解
    目录1. Validation 介绍1.1 Validation 注解1.2 @valid 和 @validated的区别2. SpringBoot 中使用 Validator 校验...
    99+
    2022-11-13
  • SpringBoot怎么进行参数校验
    这篇文章主要讲解了“SpringBoot怎么进行参数校验”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么进行参数校验”吧!介绍在日常的接口开发中,为了防止非法参数对业务...
    99+
    2023-06-30
  • SpringBoot参数校验的方法总结
    目录一、前言二、注解介绍三、添加依赖四、创建用于校验的实体类五、写一个测试用的接口六、在实体类中添加注解七、在 controller 方法中添加 Validated 注解八、添加全局...
    99+
    2022-11-12
  • SpringBoot参数校验Validator框架详解
    目录SpringBoot 如何进行参数校验1.集成Validator校验框架1.1. 引入依赖包1.2. 定义要参数校验的实体类1.3. 定义校验类进行测试1.4. 测试结果11.5...
    99+
    2022-11-13
  • SpringBootcontroller参数校验方法详细讲解
    目录单参数校验实体类校验分组校验嵌套校验自定义注解参数校验主要使用两个标签@Validated和@Valid; @Valid是Hibernate的注解校验,@Validated是sp...
    99+
    2023-01-17
    SpringBoot controller参数校验 SpringBoot controller
  • SpringBoot参数校验之@Valid的使用详解
    目录简介依赖代码 测试测试1:缺少字段测试2:不缺少字段测试3:缺少字段,后端获取BindResult 简介 说明 本文用示例说明SpringBoot的@Vali...
    99+
    2022-11-13
  • SpringBoot参数校验之@Validated的使用详解
    目录简介依赖用法1:不分组代码测试用法2:分组代码测试简介 说明 本文用示例说明SpringBoot的@Validated的用法。 依赖 <dependency> ...
    99+
    2022-11-13
  • SpringBoot中参数校验的方法有哪些
    这篇文章给大家分享的是有关SpringBoot中参数校验的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言在 Web 开发中经常需要对前端传过来的参数进行校验,例如格式校验、非空校验等,基本上每个...
    99+
    2023-06-15
  • 超详细讲解SpringBoot参数校验实例
    目录使用传统方式的弊端引入依赖注解说明一、对实体类进行校验1、entity2、controller3、编写全局统一异常处理二、针对单个参数进行校验三、分组校验1、entity2、co...
    99+
    2022-11-13
  • SpringBoot接口如何对参数进行校验
    目录前言什么是不优雅的参数校验实现案例POM请求参数封装Controller中获取参数绑定结果校验结果进一步理解Validation分组校验?@Validate和@Valid什么区别...
    99+
    2022-11-13
  • SpringBoot接口怎么对参数进行校验
    今天小编给大家分享一下SpringBoot接口怎么对参数进行校验的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是不优雅的...
    99+
    2023-07-02
  • SpringBoot开发详解之Controller接收参数及参数校验
    目录Controller 中注解使用传输参数的几种Method获取参数的几种常用注解使用对象直接获取参数使用@Valid对参数进行校验总结Controller 中注解使用 接受参数的...
    99+
    2022-11-13
  • Java实现优雅的参数校验方法详解
    目录一、引子二、如何优雅地校验参数2.1 官方指导意见2.2 注解用法说明一、引子 要对方法的参数进行校验,最简单暴力的写法是这个样子: public static void...
    99+
    2022-11-13
  • 如何进行SpringBoot开发的集成参数校验
    这期内容当中小编将会给大家带来有关如何进行SpringBoot开发的集成参数校验,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。对于 web服务来说,为防止非法参数对业务造...
    99+
    2022-10-19
  • SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验详解
    目录spring boot 常见http get ,post请求参数处理PathVaribale 获取url路径的数据RequestParam 获取请求参数的值注意GET参数校验PO...
    99+
    2022-11-13
  • SpringBoot集成Validation参数校验的方法是什么
    这篇“SpringBoot集成Validation参数校验的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spri...
    99+
    2023-06-26
  • Springboot如何使用filter对requestbody参数进行校验
    目录使用filter对request body参数进行校验通过filter修改body参数的思路知识点步骤使用filter对request body参数进行校验 @Slf4j pub...
    99+
    2022-11-13
  • SpringBoot如何进行业务校验实例详解
    目录前言为什么需要Assert?如何使用Assert加入全局异常拦截器常见的Assert使用场景小结总结前言 今天继续来聊聊在SpringBoot项目中如何实现业务异常校验Asser...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作