(九)springboot实战——springboot3下的webflux项目参数验证及其全局参数验证异常处理

news2024/11/17 5:54:16

前言

在上一节内容中,我们介绍了如何在webflux项目中自定义实现一个全局的异常处理器ErrorWebExceptionHandler,正常情况下其可以处理我们系统的运行时异常,但是无法处理参数验证的异常WebExchangeBindException,所以这里提供另外的全局异常处理方式,通过注解@ExceptionHandler实现参数验证的全局异常处理。

本节内容主要是实现webflux项目集成spring-boot-starter-validation验证框架,完成请求接口参数的后台验证,实现接口请求参数的统一验证处理,返回统一的响应数据格式。

正文

①引入请求参数验证框架spring-boot-starter-validation

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

 ②创建全局的参数验证异常处理器GlobalExceptionHandler

package com.yundi.atp.exception;

import com.yundi.atp.common.ApiResponse;
import com.yundi.atp.common.ErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.support.WebExchangeBindException;
import reactor.core.publisher.Mono;

import java.util.List;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 参数验证异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(WebExchangeBindException.class)
    public Mono<ApiResponse> handleWebExchangeBindException(WebExchangeBindException ex) {
        log.info("参数验证异常:" + ex);
        // 处理绑定异常
        BindingResult result = ex.getBindingResult();
        List<FieldError> fieldErrors = result.getFieldErrors();
        return Mono.just(ApiResponse.fail(ErrorCode.WEB_EXCHANGE_BIND_ERROR.getCode(), fieldErrors.get(0).getDefaultMessage()));
    }

    /**
     * 数学计算异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(ArithmeticException.class)
    public Mono<ApiResponse> handleArithmeticException(ArithmeticException ex) {
        log.info("数学计算异常:" + ex);
        return Mono.just(ApiResponse.fail(ErrorCode.ARITHMETIC_ERROR.getCode(), ErrorCode.ARITHMETIC_ERROR.getMsg()));
    }

    /**
     * 自定义异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(MyException.class)
    public Mono<ApiResponse> handleMyException(MyException ex) {
        log.info("自定义异常:" + ex);
        return Mono.just(ApiResponse.fail(ex.getCode(), ex.getMessage()));
    }

    /**
     * 兜底异常
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Mono<ApiResponse> handleMyException(Exception ex) {
        log.info("系统异常:" + ex);
        return Mono.just(ApiResponse.fail(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMsg()));
    }
}

③ ErrorCode统一定义错误码,方便根据相关错误码处理业务

package com.yundi.atp.common;


public enum ErrorCode {
    SYSTEM_ERROR(10000, "系统错误!"),
    ARITHMETIC_ERROR(10001, "数学计算异常!"),
    WEB_EXCHANGE_BIND_ERROR(10002, "参数验证异常!"),
    ;


    private Integer code;
    private String msg;

    ErrorCode(Integer code, String message) {
        this.code = code;
        this.msg = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

 ④以新增用户数据为例,增加用户数据的验证

package com.yundi.atp.entity;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;


@Schema(name = "User", description = "用户类")
@Table(name = "user")
@Data
public class User {
    @Id
    @Schema(name = "id", description = "用户ID")
    private Integer id;

    @NotBlank(message = "用户名称不得为空!")
    @Schema(name = "name", description = "用户名称")
    private String name;

    @NotNull(message = "用户年龄不得为空!")
    @Schema(name = "age", description = "用户年龄")
    private Integer age;
}

 ⑤在保存用户请求接口中使用@Valid注解,开启请求参数验证

⑥ 启动webflux应用,使用swagger工具测试保存用户接口,验证参数注解生效,并按照统一响应格式返回了数据

⑦ 验证用户年龄的参数不为空

⑧ swagger需要使用专属webflux的springdoc-openapi-starter-webflux-ui启动器

<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webflux-ui -->
<dependency>
	<groupId>org.springdoc</groupId>
	<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
	<version>2.3.0</version>
</dependency>

结语

关于webflux项目的请求参数验证,以及统一的参数验证异常处理的内容到这里就结束了,我们下期见。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1418176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Amazon CodeWhisperer 代码提示——Golang 测评

前言 官网链接&#xff1a; 亚马逊云科技 Amazon CodeGuru Reviewer 中的 CodeWhisperer 是一种代码提示工具&#xff0c;它使用机器学习和人工智能技术来提高开发人员的代码质量和效率。它可以通过分析代码库中的历史代码和最佳实践&#xff0c;为开发人员提供有关如何改进其…

vue预览pdf文件的几种方法

文章目录 vue预览pdf集中方法方法一&#xff1a;方法二&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a; 方法三&#xff1a;展示效果&#xff1a;需要包依赖&#xff1a;代码&#xff1a;自己调参数&#xff0c;选择符合自己的 vue预览pdf集中方法 我…

selenium-Web界面搜索功能测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 测试环境准备&#xff1a; 1、安装Python 2、安装Ch…

C++面试宝典第25题:阶乘末尾零的个数

题目 给定一个整数n,返回n!(n的阶乘)结果尾数中零的个数。 示例 1: 输入:3 输出:0 解释:3! = 6,尾数中没有零。 示例 2: 输入:5 输出:1 解释:5! = 120,尾数中有1个零。 解析 这道题主要考察应聘者对于数学问题的分析和理解能力,以及在多个解决方案中,寻求最优…

Python 拼接字符串的 7 种方式

忘了在哪看到一位编程大牛调侃&#xff0c;他说程序员每天就做两件事&#xff0c;其中之一就是处理字符串。相信不少同学会有同感。 几乎任何一种编程语言&#xff0c;都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天&#xff0c;我跟大家一起来…

Github 2024-01-28 开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-28统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目3TypeScript项目2Rust项目1HTML项目1JavaScript项目1Cuda项目1C#项目1非开发语言项目1 Nuxt&#…

Spring Boot通过配置文件支持数据库自定义表名

直接上干货&#xff1a; 例如一个叫xxx的项目&#xff0c;yml文件里加上这段 xxxproject:db:xxxTable: xxx_dbname #自定义的数据库表名创一个Configuration类放表名和Mapper // XxxProjectAutoConfiguration.javaConfiguration MapperScan(basePackages "cn.com.xxxp…

蓝牙----蓝牙连接建立_连接建立

蓝牙----蓝牙连接建立_连接建立 蓝牙连接建立过程图1.主机扫描到广播包1.1判断是否是自己关心的广播包1.2广播地址添加到扫描列表 2.主机扫描结束&#xff0c;建立连接3.主从连接成功后&#xff0c;执行连接建立后事件3.1.主机将连接句柄和设备地址添加到连接列表3.2.主机进行G…

ad18学习笔记十六:v割

所谓“V割”是印刷电路板&#xff08;PCB&#xff09;厂商依据客户的图纸要求&#xff0c;事先在PCB的特定位置用转盘刀具切割好的一条条分割线&#xff0c;其目的是为了方便后续SMT电路板组装完成后的分板之用&#xff0c;因为其切割后的外型看起来就像个英文的“V”字型&…

msfconsole实战使用(结合靶场演示)

msfconsole实战使用 前言 MSFconsole&#xff08;Metasploit Framework Console&#xff09;是Metasploit框架的一部分&#xff0c;是一个功能强大的渗透测试工具。Metasploit框架是一个开源的安全工具&#xff0c;旨在开发、测试和执行针对计算机系统的攻击。MSFconsole是Me…

SpringMvc切换Json转换工具

SpringBoot切换使用goolge的Gson作为SpringMvc的Json转换工具 <!-- gson依赖 --> <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId> </dependency>Configuration public class JsonWebConfig {B…

ThreadLocal学习笔记

ThreadLocal类图 ThreadLocal/InheritableThreadLocal/ \TransmittableThreadLocal(阿里巴巴) TransmissibleThreadLocal(阿里巴巴)ThreadLocal 这是Thread类的局部变量&#xff0c;每个线程私有。 它主要用于解决多线程中的数据共享问题&#xff0c;保…

把数组中的key都取出来然后去重

今日接到一个小需求&#xff0c;一张表有类似这样的数据&#xff1a;&#xff08;下面是一行&#xff09; 但是每行的数据&#xff0c;主要是key不一样&#xff0c;我们想把所有的key取出来&#xff0c;并且做个去重。 首先我先在mysql中&#xff0c; SELECT GROUP_CONCAT(RE…

在租户内启用SharePoint Embedded

要开启 SharePoint Embedded&#xff0c;你得是管理员&#xff0c;然后按照这些步骤操作&#xff1a; 登录到你的 SharePoint 管理中心。在左边的菜单里找到“设置”选项&#xff0c;点进去。 3. 在设置页面里找到“SharePoint Embedded 应用”。 4.如果这个功能还没开启&…

高阶测试开发必备技能: k8s入门!

现在稍微有点规模公司都是基于docker容器化部署技巧&#xff0c;K8s现在主流&#xff0c;应用最广的容器集群管理技术。 k8s全称kubernetes&#xff08;首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s&#xff0c;所以简称 k8s&#xff09;&#xff0c;基于Docker容器…

Top-level await is not available in the configured target environment

当在使用 Vite 进行项目构建时&#xff0c;可能会遇到如下错误提示&#xff1a;ERROR: Top-level await is not available in the configured target environment。 问题原因 这个错误通常是由于项目配置中的目标浏览器环境不支持 JavaScript 的 top-level-await 特性。top-le…

探索Viper-适用于GoLang的完整配置解决方案

前言 对于现代应用程序&#xff0c;尤其大中型的项目来说&#xff0c;在程序启动和运行时&#xff0c;往往需要传入许多参数来控制程序的行为&#xff0c;我们可以通过命令行参数&#xff0c;环境变量&#xff0c;配置文件等方式来将参数传递给程序。而Viper库为Golang语言开发…

Mac安装配置maven

Mac安装配置maven 官网下载地址&#xff1a;https://maven.apache.org/download.cgi 下载好以后解压配置 maven 环境变量 打开终端&#xff0c;输入命令打开配置文件./bash_profile open ~/.bash_profile输入i进入编辑模式,进行maven配置; MAVEN_HOME为maven的本地路径 ex…

VR全景技术对党建宣传有什么好处,如何应用在党建宣传

引言&#xff1a; 近年来&#xff0c;随着VR&#xff08;虚拟现实&#xff09;全景技术的不断发展&#xff0c;其在各个领域的应用也愈加广泛。在党建宣传方面&#xff0c;VR全景技术正逐渐成为一种创新而强大的工具&#xff0c;为组织的思想宣传提供了全新的方式。 一&#x…

SpringBoot 实现自定义指标监控

一、添加业务监控指标 在 spring-web-prometheus-demo 项目的基础上&#xff0c;我们添加一个 PrometheusCustomMonitor 类。在这里面我们定义了三个业务指标&#xff1a; order_request_count&#xff1a;下单总次数order_amount_sum&#xff1a;下单总金额 Component publ…