【问题标题】:Get application.yml infos in spring在 spring 中获取 application.yml 信息
【发布时间】:2017-05-01 07:43:14
【问题描述】:

我在我的 application.yml 文件中添加了一些配置,我想从我的 Java 代码中读取它。

YAML 文件中添加的节点如下所示:

myConfig:
    projectOne:
        mantisID: 501
        user: username
        password: passwd
    projectTwo:
        mantisID: 502
        user: username
        password: passwd

我想要的是获得一个项目对象列表

Project.mantisID = 501,
Project.user = "username",
Project.password = "passwd",

等等……

我知道 spring 可以通过一些 @Value 注释读取这个文件,但是我如何使用它来获得我需要的东西?

【问题讨论】:

  • 我在 YAML 文件中没有看到任何代码,只有标量和映射。你问如何重写 YAML 文件?如果不是,则 yaml 应用不当
  • 我的意思是“节点”、“映射”。我不知道正确的词。我的意思是元素。
  • YAML 中的元素仅按顺序出现,您的 YAML 中没有任何元素。如果您不知道正确的 YAML 术语(如果您只使用一种语言/解析器,通常会发生这种情况),那么至少要为您的语言添加前缀名称(Java node)。当你注意到你写错了,请通过编辑和更正使问题对未来的读者更有用。 您的问题可能会得到解决,但我们正在努力在这里建立一个高质量的问答网站。

标签: java spring spring-boot yaml


【解决方案1】:

您可以使用@ConfigurationProperties 注释将您的配置映射到Bean,然后您就可以在任何地方注入您的Bean 并获取这些属性。

为此,首先创建一个代表配置中数据结构的类。然后用@ConfigurationProperties@Configuration 注解。

@Configuration
@ConfigurationProperties
public class MyConfig {

    private final Map<String, Project> myConfig = new HashMap<>();

    public Map<String, Project> getMyConfig() {
        return myConfig;
    }

    public static class Project {

        private String mantisID;
        private String password;
        private String user;

        // Getters and setters...
    }
}

注意Project 类中需要 getter 和 setter。另外请记住,getter 和 setter 的命名在这里很重要。

设置完此类后,您可以将其注入项目的任何位置并访问其属性。

@Service
public class SomeService {

    private final Map<String, MyConfig.Project> projects;

    @Autowired
    public SomeService(MyConfig config) {
        this.projects = config.getMyConfig();

        projects.get("projectOne").getMantisID();
        projects.get("projectTwo").getPassword();
    }
}

您可以阅读有关此here 的更多信息。

【讨论】:

  • 好的,非常感谢您的回答。我在您提供的在线资源上,但真的无法猜出我的出路^^。我还有一个问题,如果我想将项目列表放在 foreach 中,我该怎么办。想象一下,我的用户在 .yml 文件中添加了一个“projectThree”。我需要自动获取 myConfig: entry 的所有子项目。
  • 如果我正确理解了您的问题,您可以使用 .values().entrySet() 方法获取所有地图值并对其进行迭代,例如projects.values().forEach(p -&gt; { /* Do something with your project. */ });.
【解决方案2】:

为了结束,我回答了我的第二个问题。 这就是我的服务现在的样子:

@Service
public class MantisProjectService {

    private final Map<String, MantisProjectConfiguration.Project> projects;

    private List<MantisProjectConfiguration.Project> mantisProjects = new ArrayList<>();

    @Autowired
    public MantisProjectService(MantisProjectConfiguration mantisProjectConfiguration)
    {
        this.projects = mantisProjectConfiguration.getMantisProjectConfiguration();

        for (Map.Entry<String, MantisProjectConfiguration.Project> project : projects.entrySet())
        {
            MantisProjectConfiguration.Project mantisProject = project.getValue();
            mantisProject.setName(project.getKey());
            mantisProjects.add(mantisProject);
        }
    }

    public List<MantisProjectConfiguration.Project> getMantisProjects()
    {
        return mantisProjects;
    }

}

它返回所有项目的列表。它太棒了! =)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2019-05-19
    • 1970-01-01
    • 2013-04-03
    • 2020-02-17
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多