gpt4 book ai didi

java - 从 Java 中的 yaml 读取 map 得到 null

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:54 25 4
gpt4 key购买 nike

我在使用 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" />

现在,我的期望是,在我的 spring-test 应用程序运行期间(上下文 xml 来 self 的测试资源,yaml 也在我的测试中),订单和请求的这些值已设置,但它们为空。另外,请注意,除了我使用@Value(${...}) 注入(inject)的这个值之外,我的 yaml 中还有其他值,它们注入(inject)得非常好!

我看了这个:Spring Boot - inject map from application.yml

我做了几乎相同的事情,但我的值(value)观尚未确定。请帮忙。

我正在通过谷歌搜索,找到了这个链接: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/YamlPropertiesFactoryBean.html

在这方面,它说,所有内容都被读取为字符串而不是 map 。是否有任何其他类支持像他们在这里那样读取 Yaml 文件:Spring Boot - inject map from 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 。因此添加了这两个依赖项,但如果有办法删除它们,我会非常乐意删除这两个依赖项。

亲切的问候,帕万

最佳答案

我在使用不同的泛型类型时遇到了同样的问题,我通过初始化 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 菱形运算符并将成员类型更改为 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 加载和配置。

关于java - 从 Java 中的 yaml 读取 map 得到 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34697611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com