You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot Web项目本地运行正常 部署Heroku后Thymeleaf下拉框无数据如何解决

问题根因

你的问题和依赖版本无关,核心原因是:Spring Boot 打包为可执行JAR包部署时,classpath下的静态资源文件是封装在JAR包内部的,无法通过File API直接读取。你当前代码中使用ClassPathResource.getFile()的写法在本地开发环境(资源文件是磁盘上的独立文件)可以正常运行,但在Heroku上运行JAR包时会抛出FileNotFoundException。你现有逻辑仅打印异常不做中断处理,会最终导致货币列表是空值,前端下拉框无选项。

另外你Service代码中float rate = getExchangeRate(currencyCode);后多余的JSON字符属于笔误,建议先删除避免不必要的编译/运行异常。

修复方案

1. 修改资源读取逻辑,改用InputStream读取

将读取JSON和CSV文件的逻辑从获取File对象改为直接获取输入流,该写法对本地开发环境和JAR包运行环境都兼容:

修改后的loadExchangeRateFromJSON方法

private void loadExchangeRateFromJSON() {
    try (InputStream inputStream = new ClassPathResource("static/exchange_rate.json").getInputStream();
         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
        ObjectMapper objectMapper = new ObjectMapper();
        masterNode = objectMapper.readTree(bufferedReader);
    } catch (IOException e) {
        e.printStackTrace();
        // 资源加载失败属于严重错误,直接抛出异常中断启动,避免静默失败
        throw new RuntimeException("汇率配置文件加载失败", e);
    }
}

修改后的loadCurrencyCodeFromCSV方法

public void loadCurrencyCodeFromCSV() {
    mapCurrencyRates = new HashMap<>();
    try (InputStream inputStream = new ClassPathResource("static/currency.csv").getInputStream();
         Reader reader = new InputStreamReader(inputStream)) {
        CsvMapper mapper = new CsvMapper(); 
        CsvSchema schema = CsvSchema.emptySchema().withHeader(); 
        ObjectReader oReader = mapper.readerFor(CurrencyRate.class).with(schema); 
        MappingIterator<CurrencyRate> mi = oReader.readValues(reader); 

        while (mi.hasNext()) {
            CurrencyRate currencyRate = mi.next();
            String currencyCode = currencyRate.getCode();
            if (mapCurrencyRates.get(currencyCode) == null) { 
                float rate = getExchangeRate(currencyCode);
                if (rate > 0.0f) { 
                    currencyRate.setRate(rate);
                    mapCurrencyRates.put(currencyCode, currencyRate);
                }     
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException("货币配置文件加载失败", e);
    }
}

2. 优化初始化逻辑(可选)

建议将资源加载逻辑从构造函数迁移到添加了@PostConstruct注解的方法中,确保Spring Bean属性注入完成后再执行初始化,避免潜在的依赖未就绪问题。

3. 本地验证

修复后无需直接部署到Heroku验证,本地执行mvn clean package打出JAR包,在target目录下执行java -jar 打包生成的JAR文件名.jar启动服务,访问本地地址确认下拉框正常显示后,再部署到Heroku即可。

内容的提问来源于stack exchange,提问作者Minh Quang Lê

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:27:05