SpringBoot读取本地的文件并打成jar包

博主在项目中,需后端处理JSON数据并根据前端值匹配后传给第三方。开发时将JSON文件放资源文件下可正常转换为map获取数据,但打包发布报错。经查询,是因打成jar时资源文件情况改变。最终通过流的方式处理,解决了读取JSON文件的问题。

今天在做项目的时候遇到一个这样的需求,需要后端去处理json数据,然后根据前端传过来的值进行匹配。把最终的数据传给第三方。

maven 依赖

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-io</artifactId>
	<version>1.3.2</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.4</version>
</dependency>

把json文件给放到资源文件下,如图:address.json
在这里插入图片描述
json里面的数据格式是这样的

{
	"1":"中国",
	"1100":"北京市",
	....
}

在idea中开发的时候我是这样写的

 @Test
    public void jsonTest(){
        try {
            File jsonFile = ResourceUtils.getFile("classpath:address.json");
            String json = FileUtils.readFileToString(jsonFile, "UTF-8");
            System.out.println(json);
            JSONObject jsonObject = JSONObject.parseObject(json);
            String aa = "1100";
            String bb = "2309";
            Object value1 = null;

            Object valueshi = null;

            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {

            }

            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
                if (entry.getKey().equals(aa)){
                    value1 = entry.getValue();
                    //System.out.println("aa是"+entry.getValue());
                }
                if (entry.getKey().equals(bb)){
                    valueshi = entry.getValue();
                    //System.out.println("bb是"+entry.getValue());
                }
            }
            System.out.println(value1+""+valueshi);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

自己调试的时候是没什么问题的,可以把这个数据给转换成map,之后再根据键值对获取数据。这样就可以根据前端传过来的值去匹配,获取正确的值。满心欢喜去打包发布,然后就报了错,查看报错信息,之后百度。说是在source(资源文件中的内容即json)在打成jar的时候是挂到上面的,并不存在于资源文件中,因而报了没有发现这个json文件的异常。之后通过流的方式去处理。修改之后的代码是这样的

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ResourceUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
@SpringBootTest
public class TestApplication {
	@Test
    public void Test3(){
        // 打成jar包后 读取json文件
        ClassPathResource resource = new ClassPathResource("address.json");
        StringBuilder builder = new StringBuilder();
        try {
            InputStreamReader json = new InputStreamReader(resource.getInputStream(),"UTF-8");
            // 读取文件
            BufferedReader bfReader = new BufferedReader(json);
            String tmpContent = null;
            while ((tmpContent = bfReader.readLine()) != null){
                builder.append(tmpContent);
            }

            String str = builder.toString();
            JSONObject jsonObject = JSONObject.parseObject(str);
            String aa = "1100";
            String bb = "2309";
            Object value1 = null;

            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
                if (entry.getKey().equals(aa)){
                    value1 = entry.getValue();
                }
            }

            System.out.println("转换后的字符串"+value1);
            System.out.println("原来的字符串"+builder);
            bfReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
    }

这样发布到服务器上就不会出现问题了,可以读到资源文件中的json内容啦。要是有什么不懂的地方欢迎大家留言讨论。

### 如何在Spring Boot应用程序打JAR读取外部配置文件 #### 方法一:通过命令行参数传递配置文件路径 当启动Spring Boot JAR时,可以通过`--spring.config.location`参数指定外部配置文件的位置。这允许应用加载来自不同环境下的特定设置。 ```bash java -jar myapp.jar --spring.config.location=/path/to/application.properties ``` 这种方式适用于希望覆盖默认配置的情况[^1]。 #### 方法二:利用系统属性或环境变量设定配置源 除了直接提供命令行选项外,还可以借助Java系统的属性或是操作系统的环境变量来定义配置文件的查找位置: - **System Property**: `- **Environment Variable**: `export SPRING_CONFIG_LOCATION=/path/to/config/` 这些方法同样支持多个路径分隔符(逗号),以便于同时引入多份配置文档[^2]。 #### 方法三:放置配置文件到标准目录结构内 对于某些场景而言,在构建过程中预先安排好必要的资源配置可能是更简便的选择。按照约定俗成的做法,可以将额外的应用程序配置置于如下几个预设好的地方之一: - 当前工作目录中的`config`子文件夹; - 用户主目录里的`.config/<appName>/`路径下; - `/etc/<appName>/`操作系统级别的全局配置区。 只要遵循上述任一模式布置文件,则无需任何特殊处理就能让Spring Boot自动识别加载它们[^3]。 #### 示例代码展示如何编写测试类验证外部化配置生效情况 为了确认外部化的配置已经被成功解析和运用到了实际业务逻辑之中,下面给出一段简单的单元测试样例作为参考: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {"management.endpoints.web.exposure.include=*"}) public class ExternalConfigTest { @Autowired private MyService myService; @Test public void contextLoads() { // 测试服务行为是否依据预期配置执行... } } ``` 此段代码片段展示了怎样结合使用`@SpringBootTest`注解以及注入待测组件来进行集成层面的功能检验[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值