什么?你用service调controller,那参数校验怎么办?

你好,我是柳岸花开。

你有没有遇到过用service调controller的场景?我司公有云用的微服务架构,私有云则用的合并完的微服务架构——一个单体,这就涉及到用service调controller,这个明显的问题是参数校验会失效,如果解决呢?

在任何软件系统中,确保数据的可靠性和完整性至关重要。特别是在微服务架构等复杂生态系统中,多个服务相互交互时,验证输入参数变得至关重要。在本文中,我们将探讨如何通过使用Spring AOP和Bean Validation实现统一的参数验证方法,从而提高API的可靠性。

引言:参数验证的重要性

想象一下,一个API接收到了格式不正确或无效的数据。这种情况可能导致意外行为、安全漏洞,甚至系统崩溃。为了降低这些风险,有必要在进一步处理之前验证输入参数。传统上,每个API端点可能独立处理验证,导致代码重复和不一致。然而,通过集中验证逻辑,我们可以简化流程,并确保应用程序的统一性。

使用Spring AOP实现统一验证

Spring面向切面编程(AOP)提供了一种强大的机制,用于模块化跨越关注点,如日志记录、安全性和验证。利用AOP,我们可以拦截方法调用,并在多个端点上统一应用验证逻辑。

在我们的实现中,我们创建了一个ValidatorAspect类,并用@Aspect注解进行注释,以将其标记为切面。该切面使用切入点表达式拦截特定包内控制器类的方法调用。

@Data
@Aspect
@Component
public class ValidatorAspect {
}

使用Bean Validation进行参数验证

为了执行参数验证,我们利用Bean Validation,这是一个标准的Java EE规范,提供了一种声明性的验证Java对象的方式。通过使用验证约束,如@NotNull@Size,对方法参数进行注解,我们定义了可接受数据的规则。

在我们的切面中,我们注入了一个SpringValidatorAdapter,以利用Spring的验证能力。在拦截方法调用时,我们遍历方法参数,针对每个参数进行验证,并根据定义的约束检查是否违反。如果出现任何违规情况,我们抛出一个ConstraintViolationException,表示输入无效。

@Data
@Aspect
@Component
public class ValidatorAspect {

    private final SpringValidatorAdapter validator;

    /**
     * 拦截所有Controller
     *
     * @param joinPoint joinPoint
     */

    @Before("execution(* bob..*Controller.*(..)) || execution(* log..*Controller.*(..)) || execution(* workflow..*Controller.*(..))")
    public void before(JoinPoint joinPoint) {
        for (Object arg : joinPoint.getArgs()) {
            Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(arg);
            if (constraintViolationSet.isEmpty()) {
                continue;
            }
            ConstraintViolation<Object> constraintViolation = constraintViolationSet.iterator().next();
            throw new ConstraintViolationException(constraintViolation.getPropertyPath() + constraintViolation.getMessage(), null);
        }

    }

}

通过部署模式条件保证一致性

为了保持灵活性,我们的验证机制根据部署模式有条件地启用。使用@ConditionalOnDeployMode,我们确保验证仅在特定的部署环境下生效,例如我们的情况下的“合并”模式。

@Data
@Aspect
@Component
@ConditionalOnDeployMode(mode = DeployModeEnum.MERGE)
public class ValidatorAspect {

    private final SpringValidatorAdapter validator;

    /**
     * 拦截所有Controller
     *
     * @param joinPoint joinPoint
     */

    @Before("execution(* bob..*Controller.*(..)) || execution(* log..*Controller.*(..)) || execution(* workflow..*Controller.*(..))")
    public void before(JoinPoint joinPoint) {
        for (Object arg : joinPoint.getArgs()) {
            Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(arg);
            if (constraintViolationSet.isEmpty()) {
                continue;
            }
            ConstraintViolation<Object> constraintViolation = constraintViolationSet.iterator().next();
            throw new ConstraintViolationException(constraintViolation.getPropertyPath() + constraintViolation.getMessage(), null);
        }

    }

}

结论

总之,通过使用Spring AOP和Bean Validation实现统一的参数验证方法,我们提高了API的可靠性和健壮性。集中验证逻辑不仅减少了代码重复,还确保了应用程序的一致性。通过基于部署模式的条件激活,我们在不牺牲验证完整性的情况下保持了灵活性。通过采用这样的实践,我们可以在当今的动态环境中构建更具韧性和安全性的软件系统。

本文由 mdnice 多平台发布

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

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

相关文章

【网络安全产品】---应用防火墙(WAF)

what Web应用防火墙&#xff08;Web Application Firewall) WAF可对网站或者App的业务流量进行恶意特征识别及防护&#xff0c;在对流量清洗和过滤后&#xff0c;将正常、安全的流量返回给服务器&#xff0c;避免网站服务器被恶意入侵导致性能异常等问题&#xff0c;从而保障…

快速了解Django:核心概念解析与实践指南

title: 快速了解Django&#xff1a;核心概念解析与实践指南 date: 2024/5/1 20:31:41 updated: 2024/5/1 20:31:41 categories: 后端开发 tags: Django核心路由系统视图系统ORM管理中间件Web框架登录装饰器 第一章&#xff1a;Django简介 背景和发展历程&#xff1a; Djan…

计算机毕业设计springboot基于vue电商抢购限时秒杀系统ch0h8

技术栈 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7以上版本 可选框架&#xff1a;ssmspringboot都有的 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库工具&#xff1a;Navicat/SQLyog都可以 开发工具 Ec…

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;部分常用命令说明二-CSDN博客 CMakeLi…

【算法设计与分析】六、动态规划:(二)上机-1、地牢逃生【理论到程序】

文章目录 一、题目1、问题2、输入输出要求3、样例说明4、数据范围 二、思路1、GPT4 - fail算法解释C 实现 2、Claude3 - fail问题分析算法实现 3、个人拙见 - succeed 三、代码实现 一、题目 1、问题 用一个 nn 的矩阵表示一座地牢&#xff0c;矩阵中第 i 行第 j 列的方格的值…

力扣每日一题106:从中序与后序遍历序列构造二叉树

题目 中等 相关标签 相关企业 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder …

OpenCV(五) —— 人脸识别模型训练与 Windows 下的人脸识别

本文主要内容&#xff1a; 如何训练 OpenCV 的人脸识别模型如何在 Windows 下利用 OpenCV 进行人脸识别 1、概述 人脸识别需要人脸模型&#xff08;特征集合&#xff09;的支持&#xff0c;人脸定位的速度与准确度取决于模型。 OpenCV 提供了已经训练好的模型&#xff0c;无…

KAN网络认识

首先&#xff0c;这是一个基于柯尔莫哥洛夫-阿诺德表示定理的网络。这个定理指出如果函数f是定义在有界域上的多变量连续函数&#xff08;即最终要拟合的非线性函数是连续的&#xff09;&#xff0c;那么该函数就可以表示为多个单变量、加法连续函数的有线组合。 对于机器学习…

大数据BI可视化(Echarts组件)项目开发-熟悉交互API5.0

全局echarts对象 init初始化 registerTheme注册主题 var mCharts echarts.init(document.querySelector("div"), itcast)registerMap地图图表 connect 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

程序员副业项目开发支付解决方案

个人支付解决方案 让我们跳过开发环节&#xff0c;来谈谈如何变现。大部分支付方案都是为企业设计的&#xff0c;面向个人的正规支付方案相对较少。那么&#xff0c;对于那些没有注册公司的个人来说&#xff0c;怎样才能更安全地收款呢&#xff1f; 常见的几种个人收款方式 个…

OpenCV(六) —— Android 下的人脸识别

本篇我们来介绍在 Android 下如何实现人脸识别。 上一篇我们介绍了如何在 Windows 下通过 OpenCV 实现人脸识别&#xff0c;实际上&#xff0c;在 Android 下的实现的核心原理是非常相似的&#xff0c;因为 OpenCV 部分的代码改动不大&#xff0c;绝大部分代码可以直接移植到 …

ubuntu安装LVGL/lv_img_conv并在thinkphp中进行调用生成bin文件

项目需求&#xff1a;需要处理图片成为bin文件&#xff0c;并以二进制的方式传给蓝牙设备&#xff0c;当前仅介绍如何安装&#xff0c;对lvgl功能和简介不做过多描述 项目库地址&#xff1a;https://github.com/lvgl/lv_img_conv 安装过程比较简单 一&#xff0c;确保node.j…

mall-cook本地部署运行

下载源代码 https://github.com/wangyuan389/mall-cook 下载好之后解压&#xff0c;删除.github和yarn.lock&#xff0c;因为使用pnpm 启动文档部署 切换到packages\mall-cook-document&#xff0c;删除yarn.lock&#xff0c;安装依赖包pnpm install 执行pnpm dev启动文档…

C语言/数据结构——(用双链表实现数据的增删查改)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;前面我们已经通过数组实现数据的增删查改、单链表实现数据的增删查改&#xff0c;现在让我们尝试一下使用双链表实现数据的增删查改吧&#xff01; 二.正文 如同往常一样&#xff0c;对于稍微大点的项目来说&#xff0c;…

TCP与UDP协议:你应该知道的传输层协议

第一部分&#xff1a;引言与协议概述 在互联网通信的宏伟架构中&#xff0c;传输控制协议(TCP, Transmission Control Protocol)与用户数据报协议(UDP, User Datagram Protocol)如同两颗璀璨的星辰&#xff0c;各自扮演着不可或缺的角色。它们作为传输层的两大支柱&#xff0c…

推荐网站(2)今日热榜合集,看不同软件的热点事件

当我们想要看微博&#xff0c;今日头条&#xff0c;bilibili等等今日热点时&#xff0c;需要打开对应的app查看&#xff0c;但是有了这个网站我们可以看不同平台的热点消息&#xff0c;甚至京东&#xff0c;淘宝等购物软件&#xff0c;也能看到热销总榜。 链接直达&#xff1a;…

day-28 除自身以外数组的乘积

思路 利用两个空数组left&#xff08;left[i]表示nums下标从0到i的乘积&#xff09;和right&#xff08;right[i]表示nums下标从n-1到i的乘积&#xff09; 解题方法 返回数组nums[i]right[i1]*left[i-1],第一个元素和最后一个元素单独考虑 Code class Solution {public int[…

【计算机网络】计算机网络的定义和分类

一.定义 计算机网络并没有一个精确和统一的定义&#xff0c;在计算机网络发展的不同阶段&#xff0c;人们对计算机网络给出了不同的定义&#xff0c;这些定义反映了当时计算机网络技术的发展水平。 例如计算机网络早期的一个最简单定义&#xff1a;计算机网络是一些互连的、自…

c#Excel:2.写入Excel表 3.读取Excel表

--写入Excel表-- 该例首先从数据库aq中读取学生信息表staq(参考数据库章节)&#xff0c;然后将学生信息表中的数据写入Excel表格中 &#xff08;1&#xff09;在OfficeOperator类库项目的ExcelOperator类中定义索引器&#xff0c;用于获取Excel表格中的单元格&#xff0c;代码…

队列集使用

文章目录 前言一、功能描述二、功能实现 前言 在实际使用中我们可能要从多个队列中得到数据&#xff0c;就需要队列集。 一、功能描述 创建两个队列Queue1、Queue2。Task1往Queue1写数据、Task2往Queue2写数据。Task3使用QueueSet监测这两个队列。 二、功能实现 创建两个队列…