当前位置: 首页 > 面试题库 >

在Java中从Yaml读取地图获取空值

邹涵畅
2023-03-14
问题内容

我在使用spring通过java阅读yaml时遇到问题。让我先显示代码

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "countries")
public class UserLimitReader {

    private HashMap<String, Integer> orders;

    private HashMap<String, Integer> requests;

    public HashMap<String, Integer> getOrders() {
        return orders;
    }

    public void setOrderRedeemableLimit(HashMap<String, Integer>         orders) 
{
        this.orders= orders;
}

public HashMap<String, Integer> getRequests() {
    return requests;
}

public void setMonthlyRedeemableLimit(HashMap<String, Integer> requests) {
    this.requests= requests;
}
}

我的yaml文件:

cassandra:
    hosts: localhost:9142, 127.0.0.1:9142
    keyspace: test
countries:
    orders:
      JPY: 1000
      USD: 1000
    requests:
      JPY: 100000
      USD: 100000

Spring上下文xml也具有以下内容:

<bean id="yamlProperties"
    class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
    <property name="resources">
        <value>classpath:config/application.yaml</value>
    </property>
</bean>

<context:property-placeholder
    properties-ref="yamlProperties" />

现在,我的期望是,在我的春季测试应用程序运行期间(上下文xml来自我的测试资源,yaml也处于我的测试中),这些orders和requests值已设置,但它们为空。另外,请注意,除了使用@Value($
{…})注入的值之外,yaml中还有其他值,注入它们绝对好!

我看了一下:Spring Boot-从application.yml注入映射

我所做的几乎相同,但是尚未设置我的值。请帮助。

我正在浏览google,发现此链接:http :
//docs.spring.io/spring/docs/current/javadoc-
api/org/springframework/beans/factory/config/YamlPropertiesFactoryBean.html

它说,在这里,所有内容都被读取为字符串而不是映射。是否有其他类支持在此处读取Yaml文件的方式:Spring从application.yml注入映射

还是我对YamlPropertiesFactoryBean的理解错误?

compile 'org.springframework:spring-core:4.2.+'
compile 'org.springframework:spring-beans:4.2.+'
compile 'org.springframework:spring-context:4.2.+'
compile 'org.springframework.boot:spring-boot:1.3.1.RELEASE'
compile 'org.springframework.boot:spring-boot-configuration-processor:1.3.1.RELEASE'

这些是gradle中的依赖项。您可能想知道为什么我要使用spring-core和spring-boot,从本质上讲,我不希望使用spring-
boot,但是如果没有spring-boot,则不能添加@EnableConfigurationProperties和@ConfigurationProperties,老实说,我没有知道我是否可以在没有它们的情况下将yaml内容读入地图。因此,添加了这两个依赖关系,但是如果有一种方法可以删除它们,那么我很乐意删除这两个依赖关系。


问题答案:

我在使用不同的泛型类型时遇到了同样的问题,我通过初始化map成员并删除了setter方法来解决了这个问题,例如:

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "countries")
public class UserLimitReader{
    private Map<String, Integer> orders = new HashMap<>();

    private Map<String, Integer> requests = new HashMap<>();

    public Map<String, Integer> getOrders() {
        return orders;
    }
    ...
}

请注意,我使用了Java 7 Diamond运算符,并将成员类型更改为Map而不是HashMap。

重要信息:
在我的代码中,我使用Spring的配置类而不是XML,并将其EnableConfigurationProperties移至配置类。您的情况应该是这样的:

@Configuration
@EnableConfigurationProperties(value = {UserLimitReader.class})
public class SpringConfiguration {
    ...
}

@ConfigurationProperties(prefix = "countries", locations: "classpath:config/application.yaml")
public class UserLimitReader {
    ...
}

不知道如何使用XML对其进行配置,但是正如我在评论中所写的那样,我仍然认为您应该确保Spring使用组件扫描或类似方法找到您的类。

@Value可以像Spring一样使用上下文文件加载YAML文件而没有问题,但这并不意味着UserLimitReader文件是由Spring加载和配置的。



 类似资料:
  • 我在使用Spring通过java读取yaml时遇到了一个问题。让我先展示代码 我的yaml文件: spring上下文xml还具有以下功能: 在这里面,它说,所有的东西都是作为一个字符串而不是一个地图来阅读的。是否有其他类支持读取Yaml文件的方式:Spring boot-inject map from application.yml 还是我对YamlPropertiesFactoryBean的理解

  • 我想在/文件中定义特定于环境的属性。因此,我创建了以下: 接下来,我编写了这个: 如https://github.com/intuit/Karate#reading-files所示,函数应该由Karate知道,但是我不确定这是只适用于文件还是也适用于。 不幸的是,上面的都不起作用,因为我得到了这个错误: 我确信该文件存在并且是可读的。 是我做错了什么,还是我的方法不被支持?如果它不受支持,推荐的方

  • 我正在尝试从我的应用程序中获取数据。将内容配置文件详细信息转换为变量的yaml文件 应用yaml文件内容 应用程序。Java语言 输出: 您能帮助我理解为什么its没有从yaml文件中选取值吗?

  • 我有以下问题。我根据一个给定的概要文件在yaml文件中读取的值创建一个数据源。 我当前的问题是,当我用“dev”配置文件启动应用程序时,serviceId的值是'my-prod-service'。 我在这里做错了什么?

  • 问题内容: 我试图从罐子内的另一个类读取罐子内的文件。但是,我不断收到相同的错误:尝试读取度量标准时,捕获了类java.io.FileNotFoundException:metrics.yml 首先,让我的代码做这样的事情,假设它来自类的路径: 我还假设它可能会从罐子的底部开始移动,所以我也这样做了: 然后我注意到了这个线程。如何从Java的jar中读取文件?并发现我需要在路径前加一个“ /”。我

  • 问题内容: 问题 从地图中获取数据 资料格式 注意 如何从上述结果中获得以下值 1.Event_dtmReleaseDate 2.strID 3.Trans_strGuestList 我试过的 res.Map(“ Event_dtmReleaseDate”); 错误:res.Map未定义(类型map [string] interface {}没有字段或方法Map) res.Event_dtmRel