【问题标题】:Spring Boot - inject static map from application.ymlSpring Boot - 从 application.yml 注入静态地图
【发布时间】:2019-05-09 09:07:02
【问题描述】:

我参考了Spring Boot - inject map from application.yml 从 application.yml 文件中注入地图

我的application.yml sn-p在下面

easy.app.pairMap:
    test1: 'value1' 
    test2: 'value2'

属性文件如下所示

@Component
@Configuration
@ConfigurationProperties("easy.app")
@EnableConfigurationProperties
public class TestProperties {



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

public void setPairMap(Map<String, String> pairMap) {
    this.pairMap= pairMap;
}

}

上面给出的代码有效。当“pairMap”设置为静态时,不会从 application.yml 文件中读取映射,如下所示。

@Component
@Configuration
@ConfigurationProperties("easy.app")
@EnableConfigurationProperties
public class TestProperties {



private static Map<String, String> pairMap= new HashMap<String, String>();

public static void setPairMap(Map<String, String> pairMap) {
    TestProperties .pairMap= pairMap;
}

}

PS:问题仅在注入 map 时出现,而不是在注入字符串时出现。为什么会出现这种行为?

即以下配置中的字符串注入有效,但映射注入无效

easy.app.key1: 'abc'

easy.app.pairMap:
     test1: 'value1' 
     test2: 'value2'

如下所示的属性文件

@Component
@Configuration
@ConfigurationProperties("easy.app")
@EnableConfigurationProperties
public class TestProperties {



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

private static String key1;

public static void setPairMap(Map<String, String> pairMap) {
    this.pairMap= pairMap;
}

public static void setKey1(String key1) {
    TestProperties.key1= key1;
}



public String getKey1(){
    return key1;
}

【问题讨论】:

  • @autowired in static classes 的可能重复项。我认为该线程会为您指明方向。
  • 如果我删除@Component 标签会怎样?
  • 答案是:here,但不要使用静态解释:here
  • 为什么要把它设为静态@Abhi
  • myclass中包括map在内的一些字段需要是静态的,其他的需要是非静态的

标签: java spring spring-boot


【解决方案1】:

解决这个问题:

easy:
  app:
    pairMap:
      test1: value1
      test2: value2

 @CompileStatic
 @Component
 @EnableConfigurationProperties
 class ConfigHolder {

   @Value(value = '${easy.app.pairMap.test1}')
   String test1Valse;

   @Value(value = '${easy.app.pairMap.test2}')
   String test2Valse;
 }



@CompileStatic
@Configuration
@EnableConfigurationProperties
public class TestProperties {

  @Autowired
  ConfigHolder configHolder;



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


  public void setPairMap(Map<String, String> pairMap) {
     if(pairMap != null && !pairMap.isNotEmpty()) {
        this.pairMap = pairMap;
     } else {
        this.pairMap.put("test 1", ${configHolder.test1Valse});
        this.pairMap.put("test 2", ${configHolder.test2Valse});
     }
  }

}

【讨论】:

    猜你喜欢
    • 2014-09-15
    • 2014-12-22
    • 2020-03-01
    • 2018-01-04
    • 2017-10-08
    • 2018-09-25
    • 1970-01-01
    • 2020-03-24
    • 2022-01-20
    相关资源
    最近更新 更多