是否可以使用 Spring Boot 注释 @Value 从 application.properties 文件中获取 Map 值 [重复]

Posted

技术标签:

【中文标题】是否可以使用 Spring Boot 注释 @Value 从 application.properties 文件中获取 Map 值 [重复]【英文标题】:Is it possible to get Map value from application.properties file using springboot annotation @Value [duplicate] 【发布时间】:2019-03-28 11:12:01 【问题描述】:

我需要从application.properties文件中获取静态键值对数据,是否可以通过SpringBoot注解@Value来实现。

建议将不胜感激。

示例: languageMap='1'='English','2'='French'

@Value($("languageMap"))
Map<String,String> languageMap;

【问题讨论】:

我想如果你选择application.yml格式而不是application.properties,这会更直观。这种格式有“字典”和地图。 【参考方案1】:

application.properties:

languageMap[1]= English
languageMap[2]= French

代码,只需使用@ConfigurationProperties 和setter 方法(setLanguageMap) 是Map 字段的必填项,否则您将无法获取值。

import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController("/myclass")
@ConfigurationProperties
public class TestControllerEx 

  Map<String, String> languageMap;

  @GetMapping
  public ResponseEntity control() 

    System.out.println(getLanguageMap());

    return new ResponseEntity("success", HttpStatus.OK);
  

  public Map<String, String> getLanguageMap() 
    return languageMap;
  

  public void setLanguageMap(Map<String, String> languageMap) 
    this.languageMap = languageMap;
  

输出:

1=English, 2=French

【讨论】:

【参考方案2】:

使用@ConfigurableProperties 并重组您的属性文件:

@Configuration
@PropertySource("<prop-file-path>")
@ConfigurationProperties()
public class ConfigProperties 
    @Value($("languageMap"))
    Map<String,String> languageMap;

属性文件:

languageMap.1=English
languageMap.2=French

【讨论】:

【参考方案3】:

您可以使用文档中提到的 @ConfigurationProperties 注释来注入 Map。

https://docs.spring.io/spring-boot/docs/1.2.3.RELEASE/reference/htmlsingle/#boot-features-external-config-loading-yaml]

根据该文档,您可以加载属性:

language.map[0]='英语'

language.map[1]='法语'

@ConfigurationProperties(prefix="language")
public class LanguageMap

    private List<String> languages= new ArrayList<String>();

    public List<String> getLanguages() 
        return this.languages;
    

【讨论】:

【参考方案4】:

是的,可以使用@ConfigurableProperties。您必须创建一个类来访问这些属性。看看this。在该示例中,查看如何访问 additionalHeaders。那会帮助你。

【讨论】:

以上是关于是否可以使用 Spring Boot 注释 @Value 从 application.properties 文件中获取 Map 值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要使用 Kotlin Junit5 和 Spring Boot 将 Spring 注释复制到内部类?

Spring Boot 中的单元测试

Spring Boot 将 Java 注释上的配置属性/消息外部化

如何检查spring boot应用程序在自动配置类中是不是有某个注释

JSF 注释不适用于 Spring-boot

使用多种数据库类型的 Spring Boot 集成测试