当前位置: 首页 > news >正文

Spring框架中的ResourcePatternResolver只能指定jar包内文件,指定容器中文件路径报错:FileNotFoundException

原始代码:

public static <T> T getFromFile(String specifiedFile, String defaultClasspathFile, Class<T> expectedClass) {try {ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources(defaultClasspathFile);Resource resource = resources[0];//  获得文件流,因为在jar文件中,不能直接通过文件资源路径拿到文件,但是可以在jar包中拿到文件流String json = readFileResource(resource);return gson.fromJson(json, expectedClass);} catch (Exception e) {throw new DtalentInitException(String.format("Fail to init instance of class[%s] by file specifiedFile[%s], defaultFile[%s]",expectedClass, specifiedFile, defaultClasspathFile), e);}}
private static String readFileResource(Resource resource) throws IOException {byte[] bytes = new byte[1024];StringBuilder buffer = new StringBuilder("");try {if(resource.exists()) {InputStream stream = resource.getInputStream();for (int n; (n = stream.read(bytes)) != -1; ) {buffer.append(new String(bytes, 0, n));}} else {}return buffer.toString();} catch (IOException e) {log.error("Read resource failed.", e);throw e;}}

调用 getFromFile并传入文件路径defaultClasspathFile读取json文件并转为某类的对象

简化代码:

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources(filePath);Resource resource = resources[0];log.info("文件是否存在{}",resource.exists())

场景:

只有当上述代码中的filepath是打到jar包内的文件路径时可用,比如resource下的static文件夹,则传入static/xxxx.json;此时可以读到文件并正常解析;

但是当指定一个非jar包内而是jar所在容器内路径如/opt/conf/xxxx.json时,调用方法时就会报错:FileNotFoundException....cannot be opened because it does not exist at org.springframework.core.io.Classload...

原因:

在Spring框架中,Resource是用于访问低级资源的接口,例如文件或类路径资源。ResourcePatternResolver是一个规定了如何解析资源模式的接口。PathMatchingResourcePatternResolver是一个能解析类路径下的文件,以及文件系统中的文件的ResourcePatternResolver实现。

当你在使用ResourcePatternResolvergetResources方法时,你可以指定一个类路径的模式,例如classpath*:com/example/**/*.xml,这将匹配所有名为.xml的文件,这些文件是在com.example包或其任何子包中。

然而,你提到的问题是“如何指定容器中的文件路径”。这个问题的答案取决于你对“容器中的文件路径”的具体含义。

  1. 如果你指的是类路径中的资源,那么你可以使用classpath:classpath*:前缀来指定资源的位置。例如,你可以使用classpath:/templates/mytemplate.txt来获取类路径中的文件。

  2. 如果你指的是文件系统中的资源,那么你可以使用file:前缀来指定资源的位置。例如,你可以使用file:/etc/config/myconfig.txt来获取文件系统中的文件。

  3. 如果你指的是Web应用程序的上下文中的资源,那么你可以使用ServletContextResource来获取这些资源。例如,你可以使用servletContext.getResourceAsStream("/WEB-INF/myfile.txt")来获取/WEB-INF/myfile.txt文件。

需要注意的是,如果你试图访问的资源不存在,那么当你试图打开一个InputStream时,你将会得到一个FileNotFoundException

最后,如果你在容器中的文件路径是动态的,或者你不能确保这些文件在所有环境中都存在,那么你可能需要使用一个更灵活的方法来访问这些资源,例如使用Java的FilePath类,或者使用Spring的ResourceLoader接口。

所以:若想指定容器内的文件路径,则需要增加:file 前缀,如:file:/opt/conf/xxx.json

http://www.lryc.cn/news/95487.html

相关文章:

  • pytorch工具——认识pytorch
  • 解决Jmeter响应内容显示乱码
  • ChatGPT和搜索引擎哪个更好用
  • Nginx 301 https跳转后出现跨域和混合内容问题 —— 筑梦之路
  • 记录--关于前端的音频可视化-Web Audio
  • docker-compose yml配置、常用命令
  • 【实战】 七、Hook,路由,与 URL 状态管理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十三)
  • 【MySQL】_5.MySQL的联合查询
  • 【后端面经】微服务构架 (1-3) | 熔断:熔断-恢复-熔断-恢复,抖来抖去怎么办?
  • 对UITextField输入内容的各种限制-总结
  • 【图论】二分图
  • 数据结构——(一)绪论
  • [ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择
  • 表单验证:输入的字符串以回车分隔并验证是否有
  • 智能财务分析-亿发财务报表管理系统,赋能中小企业财务数字化转型
  • 图为科技T501赋能工业机器人 革新传统工业流程
  • 安全狗深度参与编写的《云原生安全配置基线规范》正式发布!
  • 如何在3ds max中创建可用于真人场景的巨型机器人:第 2 部分
  • Vue中TodoList案例_编辑
  • 什么是Redis?
  • 深入浅出理解vue2/vue3响应式原理
  • ssh连接服务器配置
  • el-table 表头设置渐变色
  • GB/T 25000.51解读——软件产品的易用性怎么测?
  • 408复试day2(7大排序算法)
  • Vue消息订阅与发布
  • MySQL学习笔记 ------ 分组查询
  • Matlab 点云平面特征提取
  • vite的介绍
  • 裁员 10%,暴跌 14%,这家 IT 独角兽正在被抛弃!