SpringBoot RestTemplate 设置挡板

项目结构

image.png

代码

BaffleConfig

/*** @Description 记录配置信息* @Author wjx* @Date 2024/2/1 14:47**/
public interface BaffleConfig {// 是否开启挡板的开关public static boolean SWITCH = true;// 文件根目录public static String ROOT_PATH = "D:\\TIS\\mock";// http 挡板存在位置的文件名public static String HTTP_FILE_NAME = "http";}

BaffleInfos

import java.util.concurrent.ConcurrentHashMap;/*** @Description 存储挡板信息* @Author wjx* @Date 2024/2/1 11:25**/
public interface BaffleInfos {// http请求挡板 信息(会将文件中挡板的信息存在该处,用于全局使用)  key fileName  value 挡板内容public static ConcurrentHashMap<String, MockClientHttpResponse> HTTP_MOCK = new ConcurrentHashMap<>();
}

InitializeBaffleInfoRunner

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Arrays;/*** @Description 初始化挡板信息* @Author wjx* @Date 2024/2/1 11:38**/
@Slf4j
@Component
public class InitializeBaffleInfoRunner implements ApplicationRunner {@Autowiredprivate BaffleRead[] baffleReads;@Overridepublic void run(ApplicationArguments args) throws Exception {// 判断挡板开关是否开启if (BaffleConfig.SWITCH){log.warn("*****************************挡板功能开启*****************************");// 开启。Arrays.asList(baffleReads).parallelStream().forEach(e -> e.read());}}
}

BaffleRead

/*** @Description 读取挡板* @Author wjx* @Date 2024/2/1 14:59**/
public interface BaffleRead {void read();
}

MockClientHttpResponse

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;public class MockClientHttpResponse implements ClientHttpResponse {private final byte[] body;public MockClientHttpResponse(byte[] body) {this.body = body;}@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return HttpStatus.OK.value();}@Overridepublic String getStatusText() throws IOException {return HttpStatus.OK.getReasonPhrase();}@Overridepublic void close() {// Do nothing here}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream(body);}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}}

HttpBaffleRead

import com.tianqiauto.baffle.BaffleInfos;
import com.tianqiauto.baffle.BaffleConfig;
import com.tianqiauto.baffle.BaffleRead;
import com.tianqiauto.baffle.MockClientHttpResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;/*** @Description http 挡板读取* @Author wjx* @Date 2024/2/1 14:59**/
@Slf4j
@Component
public class HttpBaffleRead implements BaffleRead {@Overridepublic void read() {// 判断文件夹是否存在File file = new File(BaffleConfig.ROOT_PATH + File.separator + BaffleConfig.HTTP_FILE_NAME);if (file.exists()){// 遍历文件,异步读取,并存储File[] files = file.listFiles();Arrays.asList(files).parallelStream().forEach(e -> {String name = StringUtils.stripFilenameExtension(e.getName());byte[] bytes = new byte[0];try {bytes = Files.readAllBytes(e.toPath());} catch (IOException ex) {log.error("【挡板建设时发生错误】文件名:{}",name,ex);}MockClientHttpResponse mockClientHttpResponse = new MockClientHttpResponse(bytes);BaffleInfos.HTTP_MOCK.put(name,mockClientHttpResponse);});}}
}

MockHttpInterceptor

import com.tianqiauto.baffle.BaffleConfig;
import com.tianqiauto.baffle.BaffleInfos;
import com.tianqiauto.baffle.MockClientHttpResponse;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import java.io.IOException;/*** @Description http 拦截* @Author wjx* @Date 2024/2/1 16:26**/
@Component
public class MockHttpInterceptor implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {// 判断挡板开关是否开启if (BaffleConfig.SWITCH){// 开启。读取存储空间是否有对应的挡板String requestPart = request.getURI().getSchemeSpecificPart();String fileName = RequestFilenameMapping.mapping.get(requestPart);// 如果有对应的挡板,将挡板内容填充MockClientHttpResponse mockClientHttpResponse = BaffleInfos.HTTP_MOCK.get(fileName);if (mockClientHttpResponse != null) return mockClientHttpResponse;}return execution.execute(request,body);}
}

RequestFilenameMapping

import java.util.HashMap;/*** @Description 请求路径和文件名映射* @Author wjx* @Date 2024/2/1 16:56**/
public class RequestFilenameMapping {// key 请求路径    value 文件名public static HashMap<String,String> mapping;static {mapping = new HashMap<String,String>();mapping.put("//61.××××:80××/yarn","xdd1");}
}

文件存储位置

在这里插入图片描述

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

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

相关文章

最新2024如何解决谷歌浏览器Chrome谷歌翻译无法使用问题

快速恢复谷歌浏览器一键翻译功能在Chrome 中安装好【翻译】插件 Macbook 操作步骤&#xff1a; 1点击“前往”&#xff0c;打开“前往文件夹” 2 在对话框中输入“/etc” 囝找到“hosts”文件&#xff0c;复制粘贴到桌面 3 在复制的文件最后新起一行&#xff0c;输入并保存&am…

VUE3+TS使用OpenSeadragon学习之旅,实现多图片切换效果

1.官方网站&#xff1a;OpenSeadragon 2.使用npm下载插件&#xff1a;npm install openseadragon 3.在 index.html文件引入资源 <link rel"stylesheet" href"node_modules/openseadragon/build/openseadragon/openseadragon.css" /><script src…

消息队列的应用场景

消息队列的应用场景 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构使用较多的消息队列有ActiveMQ&#xff0c;RabbitMQ&#xff0c;Ze…

用户界面(UI)、用户体验(UE)和用户体验(UX)的差异

对一个应用程序而言&#xff0c;UX/UE (user experience) 设计和 UI (user interface) 设计非常重要。UX设计包括可视化布局、信息结构、可用性、图形、互动等多个方面。UI设计也属于UX范畴。正是因为三者在一定程度上具有重叠的工作内容&#xff0c;很多从业多年的设计师都分不…

ffmpeg合成mp3音频,解决音频属性不一致问题

1. 需求&#xff0c;amr转成mp3&#xff0c;再将此mp3和其他mp3合成 2. 问题&#xff1a;拼接后的第一段音频可以播放&#xff0c;第二段自动跳过&#xff0c;无法播放。 3. 解决&#xff1a; 3.1 查看各文件属性 # 查看amr转为mp3文件的属性&#xff1a;ffprobe 文件名&am…

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(五十一)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

C语言实现12种排序算法

1.冒泡排序 思路&#xff1a;比较相邻的两个数字&#xff0c;如果前一个数字大&#xff0c;那么就交换两个数字&#xff0c;直到有序。 时间复杂度&#xff1a;O(n^2)&#xff0c;稳定性&#xff1a;这是一种稳定的算法。 代码实现&#xff1a; void bubble_sort(int arr[],…

Redis的bitmap使用不当,我内存爆了

背景 最近发现Redis的内存持续暴涨&#xff0c; 涨的有点吓人&#xff0c;机器都快扛不住了&#xff0c;不得不进行Redis内存可视化分析&#xff0c;发现大量的String类型的大key 经分析&#xff0c;最近上线了页面UV的统计&#xff0c;那目前如何做的呢&#xff1f; 通过访…

Redux状态管理(运行机制及实例)

背景&#xff1a; JavaScript需要管理的状态越来越多&#xff0c;越来越复杂;这些状态包括服务器返回的数据、缓存数据、用户操作产生的数据等等&#xff0c;也包括一些UI的状态&#xff0c;比如某些元素是否被选中&#xff0c;是否显示加载动效&#xff0c;当前分页。 状态之…

浅谈信号完整性分析

什么是信号完整性?在过去的低速时代,电平跳变时信号上升时间较长,通常几个 ns。器件间的互连线不至于影响电路的功能,没必要关心信号完整性问题。但在今天的高速时代,随着 IC输出开关速度的提高,很多都在皮秒级,不管信号周期如何,几乎所有设计都遇到了信号完整性问题。…

【ACL 2023】Enhancing Document-level EAE with Contextual Clues and Role Relevance

【ACL 2023】Enhancing Document-level Event Argument Extraction with Contextual Clues and Role Relevance 论文&#xff1a;https://aclanthology.org/2023.findings-acl.817/ 代码&#xff1a;https://github.com/LWL-cpu/SCPRG-master Abstract 与句子级推理相比&…

ZigBee学习——在官方例程基础实现点灯

IAR版本 :10.10.1 Z-stack版本 :3.0.2 文章目录 一、买的板子原理图二、实现过程2.1 重定义LED的物理映射(HAL层)2.2 创建LED事件(应用层)2.2.1 定义用户事件2.2.2 修改zclGenericApp_event_loop() 2.3 触发事件 一、买的板子原理图 二、实现过程 2.1 重定义LED的物理映射(HAL…

服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

知识点&#xff1a; 1、端口协议-弱口令&未授权&攻击方式等 2、桌面应用-社交类&文档类&工具类等 章节点&#xff1a; 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数据库&中间件&…

使用Logstash将MySQL中的数据同步至Elasticsearch

目录 1 使用docker安装ELK 1.1 安装Elasticsearch 1.2 安装Kibana 1.3 安装Logstash 2 数据同步 2.1 准备MySQL表和数据 2.2 运行Logstash 2.3 测试 3 Logstash报错(踩坑)记录 3.1 记录一 3.1.1 报错信息 3.1.2 报错原因 3.1.3 解决方案 3.2 记录二 3.2.1 报错信…

图像异或加密、解密的实现

很多论文提到了从左上角开始做异或,逐行推导得到结果。 解密过程是加密的逆过程。 先看其基本方法: 参考文献: A Chaotic System Based Image Encryption Scheme with Identical Encryption and Decryption Algorithm 大多数论文都用了这个思路,我们使用MATLAB实现代码…

Leetcode 热门百题斩(第一天)

介绍 针对leetcode的热门一百题&#xff0c;解决大多数实习生面试的基本算法题。通过我自己的思路和多种方法&#xff0c;供大家参考。 1.两数之和&#xff08;题号&#xff1a;1) 方法一 最先想到的就是两个for去遍历匹配。 class Solution {public int[] twoSum(int[]…

重写Sylar基于协程的服务器(2、配置模块的设计)

重写Sylar基于协程的服务器&#xff08;2、配置模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

vue3使用is动态切换组件报错Vue received a Component which was made a reactive object.

vue3使用is动态切换组件&#xff0c;activeComponent用ref定义报错 Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with markRaw or using shallowRef ins…

cesium 多边形渐变颜色

cesium画一个渐变颜色的多边形 方式一&#xff1a;用一张颜色渐变的图片作为材质&#xff0c;结合color属性&#xff0c;可设置多边形的颜色&#xff0c;达到渐变效果。图片指向正北方向。 viewer.entities.add({polygon: {hierarchy: Cesium.Cartesian3.fromDegreesArray([115…

bs4模块

bs4模块与案例 使用指南 bs4&#xff0c;全称BeautifulSoup 4&#xff0c;是Python中一个强大的网页解析库&#xff0c;它可以帮助我们方便地从网页中提取数据。bs4将复杂HTML文档转换成树形结构&#xff0c;每个节点都是Python对象&#xff0c;所有对象可以归纳为4种&#xf…