【问题标题】:How to inject a Map in Spring @Value field?如何在 Spring @Value 字段中注入 Map?
【发布时间】:2020-03-11 11:24:00
【问题描述】:

如何将以下application.properties 注入Map 字段?

my.server.url=localhost
my.server.port=8080
my.server.timeout=10000

下面的类有什么问题?

@Service
@ConfigurationProperties("my")
public class MyService {
     private Map<String, String> server;
     public void setServer(Map<String, String> server) { this.server = server; }

    public MyService(WebClient.Builder builder) {
          this.builder = builder.uri(server.get("url")).build();
    }
}

结果:

通过构造函数的 Bean 实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化[MyService]:构造函数抛出异常;嵌套异常 是java.lang.NullPointerException

【问题讨论】:

  • 希望这会有所帮助。 stackoverflow.com/a/39906684/5201238
  • 不,仍然遇到同样的异常。
  • 不确定这是否可行。查看 Spring 代码,例如 org.springframework.boot.autoconfigure.kafka.KafkaProperties 使用构建器方法将注入的列表中的单个字符串字段转换为 Maps。
  • 糟糕的是,问题在于构造函数内部的属性还没有被注入,因此是 NPE。
  • @membersound,您对Map 的属性注入应该可以工作。您发布的异常与您的代码无关,因为您在构造函数中获得了NPE,而在您的代码中NPE 在此构造函数中是不可能的。

标签: java spring


【解决方案1】:

在配置类中创建如下 bean:

@Bean(name = "appProperties")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("application.properties"));
return bean;

}

然后将其中的值作为映射注入所需的类:

@Resource(name = "appProperties")
private Map<String, String> properties;

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 2016-01-26
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多