当前位置:  开发笔记 > 编程语言 > 正文

从Java中的yaml读取地图获取null

如何解决《从Java中的yaml读取地图获取null》经验,为你挑选了1个好方法。

使用spring,我在通过java阅读我的yaml时遇到了问题.让我先说明代码

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

    private HashMap orders;

    private HashMap requests;

    public HashMap getOrders() {
        return orders;
    }

    public void setOrderRedeemableLimit(HashMap         orders) 
{
        this.orders= orders;
}

public HashMap getRequests() {
    return requests;
}

public void setMonthlyRedeemableLimit(HashMap 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 context xml也有这个:


    
        classpath:config/application.yaml
    



现在,我所拥有的期望是,在我的spring-test应用程序的运行时(上下文xml来自我的测试资源,yaml也在我的测试中),这些订单和请求的值被设置,但他们是空的.另外,请注意,我的yaml中还有其他值,除此之外我使用@Value($ {...})注入,它们被注入绝对正常!

我看了一下:Spring Boot - 从application.yml注入地图

我做的几乎一样,但是,我的价值观没有确定.请帮助.

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

在这里,它说,一切都被读作字符串而不是地图.是否还有其他类支持读取Yaml文件,就像它们在这里一样:Spring Boot - 从application.yml注入map

或者是我对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内容读入地图.因此添加了这两个依赖项,但是如果有一种方法可以删除它们,我会非常乐意删除这两个依赖项.

温暖的问候,帕万



1> Koby..:

我对不同的泛型类型有同样的问题,我通过初始化map成员并删除setter方法解决了它,例如:

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

    private Map requests = new HashMap<>();

    public Map 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加载和配置的.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有