当前位置: 首页 > 知识库问答 >
问题:

使用spring-boot加载嵌套的yaml属性

洪鹏海
2023-03-14

我在Java spring-boot应用程序的src/main/resources中定义了以下application-errors.yml文件:

client:
 badrequest: {code: 001, message: 'Malformed request', status: 400}
 configuration: {code: 002, message: 'Invalid EC2 VPC configuration', status: 400}

server: 
 unexpected.error: 
  code: 004
  message: 'Unexpected error occurred.  Please try again'
  status: 500

请注意,我尝试了两种不同的格式来指定属性。

我通过@Configuration注释类中的以下Bean加载该属性文件:

    @Bean
    public static YamlPropertiesFactoryBean getYamlProperties() {
        YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
         yaml.setResources(new ClassPathResource("application-errors.yml"));
         return yaml;
    }

我看到属性是通过Spring环境变量加载的,但不是我所期望的模式。调试时,我可以看到加载的属性文件的源包含以下值:

{client.badrequest=code:001 message:'Malformed request' status:400, client.configuration=code:002 message:'Invalid EC2 VPC configuration' status:400, server.unexpected.error=code:004 message:'Unexpected error occurred.  Please try again' status:500}

看起来 yaml 文件被部分平展(只有两级深)。相反,我期望每个终端属性都自行扁平化。我所期望的格式是这样的:

{client.badrequest.code=001, client.badrequest.message='Malformed request', client.badrequest.status=400, client.configuration.code=002, client.configuration.message='Invalid EC2 VPC configuration', client.configuration.status=400, server.unexpected.error.code=004, server.unexpected.error.message='Unexpected error occurred.  Please try again', server.unexpected.error.status=500}

为了确保Spring完全展平属性,我需要做什么更改?如果我不理解yaml格式模式或Spring正确展平yaml文件所遵循的模式,请纠正我的理解。

共有1个答案

傅胡媚
2023-03-14

我发现今早在回答这个问题时犯了多个错误:

1)我的代码实际上并没有加载任何自定义的名为yml的属性文件。相反,它正在获取我的项目中也有的默认application.yml文件。

2)默认application.yml文件的yml格式代码语法错误。具体来说,我在每个属性标识符后省略了所需的空格:

client:
 badrequest:
  code:001
  message:'Malformed request' 
  status:400
 configuration
  code:002
  message:'Invalid EC2 VPC configuration'
  status:400

server: 
 unexpected.error
  code:004
  message:'Unexpected error occurred.  Please try again'
  status:500

在理解了这两个问题之后,我能够正确地从application.yml加载属性。

我为我的属性找到的最终语法如下:

# Error Properties

client:
 badrequest: {code: 001, message: 'Malformed request', status: 400}
 configuration: {code: 002, message: 'Invalid EC2 VPC configuration', status: 400}

server: 
 unexpected.error: {code: 004, message: 'Unexpected error occurred.  Please try again', status: 500}
 类似资料:
  • 我想从YAML向Spring上下文注入一些值。YAML的结构类似,因此我不想重复代码,但Spring启动失败,因为它无法将值注入占位符。 请注意我的: 然后我将这些值注入YAML, 然后我将其导入到配置属性上下文: 但是< code > @ Value(" $ { auto agents . supplier } ")不起作用。 请建议。

  • 我有一个名为CommonConfig的配置类,到目前为止它工作得很好… 以及与之配套的Yaml属性文件: 我的问题开始于当我想把一个映射到子B中时: 我尝试在SubB类中添加一个简单的映射声明: 当我运行这个时,所有其他属性都在配置中,但映射是空的。我还尝试不初始化映射,但它保持为空。 我的SpringBootApplication类以前只使用了一个注释就可以很好地工作。基于其他一些StackOv

  • 问题内容: 我需要从文件加载属性,该文件包含应用程序可以从中读取文件的文件夹的路径。 我正在使用以下代码来注入属性: 用于开发的文件位于下,在生产环境中使用以下命令运行应用程序,以覆盖开发设置: Spring Boot文档说: SpringApplication将在以下位置从application.properties文件加载属性,并将其添加到Spring Environment中: 当前目录的/

  • 我需要从文件加载一个属性,该文件包含应用程序可以从中读取文件的文件夹的路径。 当前目录 类路径/配置包 类路径根 是否必须使用类或添加一个特殊注释来启用Spring Boot中对的支持? 编辑:文件包含一些其他属性,这些属性由Spring Boot成功加载,如或。

  • 我想使用应用程序.yml 而不是应用程序属性 我跟着: https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html 我正在使用: 春靴 2.6.2 爪哇 17 渐变 7.3.2 我的https://github.com/OldEngineer1911

  • 我在应用程序中有我的配置。类路径根中的yml文件(src/main/resources/)。当我正常启动应用程序时,配置加载良好。然而,在我的测试中,应用程序。yml文件根本没有加载。 我的测试的标题如下所示: 配置类: 当我调试应用程序时,我看到yml文件被加载到ConfigFileApplication ationListener中,但在测试中没有调用ConfigFileApplication