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

Java读取YML文件时对象为空,请求技术协助

问题分析与解决方案

核心问题

你当前的代码存在两个关键错误:

  • 明明指定了ApplicationProperties作为反序列化目标,却将结果强制转为HashMap,导致实体类的属性绑定逻辑完全失效
  • 实体类ApplicationProperties的结构大概率和YAML文件的层级不匹配

步骤1:定义匹配YAML结构的实体类

根据你的YAML内容,实体类需要对应根节点dmsMapping的层级,示例如下:

import com.fasterxml.jackson.annotation.JsonProperty;

public class ApplicationProperties {
    private DmsMapping dmsMapping;

    // 内部类对应dmsMapping节点下的属性
    public static class DmsMapping {
        @JsonProperty("input_layer_name")
        private String inputLayerName;
        
        @JsonProperty("output_Layer_volatile")
        private String outputLayerVolatile;
        
        @JsonProperty("output_layer_IML")
        private String outputLayerIML;

        // 手动生成getter/setter,或用Lombok的@Data注解简化
        public String getInputLayerName() { return inputLayerName; }
        public void setInputLayerName(String inputLayerName) { this.inputLayerName = inputLayerName; }
        public String getOutputLayerVolatile() { return outputLayerVolatile; }
        public void setOutputLayerVolatile(String outputLayerVolatile) { this.outputLayerVolatile = outputLayerVolatile; }
        public String getOutputLayerIML() { return outputLayerIML; }
        public void setOutputLayerIML(String outputLayerIML) { this.outputLayerIML = outputLayerIML; }
    }

    public DmsMapping getDmsMapping() { return dmsMapping; }
    public void setDmsMapping(DmsMapping dmsMapping) { this.dmsMapping = dmsMapping; }
}

说明:如果不想用@JsonProperty,可以把实体类字段名改成和YAML键完全一致(包括下划线、大小写),或者配置YAML解析器的命名策略为下划线转驼峰。

步骤2:修正读取代码逻辑

直接将YAML加载结果转为ApplicationProperties,同时用try-with-resources自动管理流资源:

try (InputStream inputStream = LoadExternalConfiguration.class.getClassLoader()
        .getResourceAsStream("application.yml")) {
    Yaml yaml = new Yaml(new Constructor(ApplicationProperties.class));
    ApplicationProperties properties = yaml.load(inputStream);
    
    // 验证读取结果
    System.out.println(properties.getDmsMapping().getInputLayerName());
    System.out.println(properties.getDmsMapping().getOutputLayerVolatile());
    System.out.println(properties.getDmsMapping().getOutputLayerIML());
} catch (IOException e) {
    e.printStackTrace();
}

额外检查项

  • 确保application.yml放在项目的src/main/resources目录下(Maven/Gradle项目),保证类加载器能找到该文件
  • 确认依赖的SnakeYAML版本正确,避免因版本兼容问题导致解析失败

内容的提问来源于stack exchange,提问作者dhananjay_shingote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:48:34