有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在spring中操纵配置属性

我正在寻找一种方法来操作初始化时定义的@ConfigurationProperties,这样当我@Inject / @Autorwired使用@Bean方法配置对象时,它就被正确配置了

情景:

我在.yml文件中设置了一组属性。因为所有这些属性都匹配为字符串,所以其中一些属性需要特殊处理才能正确配置为各自的类型(其中一些是枚举)。我是否将属性对象设为@Component,然后将其注入@Bean方法并修改它?我试图组合@Bean@ConfigurationProperties注释,但对象是在@Bean方法本身返回后配置的,因此任何操作都将丢失/不可能。最好的方法是什么

例如: 在我的.yml中,我有这样一句话:

properties:
  sports:
    "football": ["Team 1", "Team 2", "Team 3"]
    "basketball": ["Team 4", "Team 5", "Team 6"]
  settings:
    "football":
      "period1": "45"
      "period2": "90"
      "players": "11"
    "basketball":
      "periods": "4"
      "players": "5"

这些与以下对象匹配:

Map<SportsEnum, List<TeamsEnum>
Map<SportsEnum, Map<SportSettingsEnum, String>>

TL;博士: 我想获取一个从.yml/.properties文件配置的对象,并操纵它的可注入表示。请提供具体的例子


共 (1) 个答案

  1. # 1 楼答案

    这是绝对支持的,我猜你做错了什么。让我们一步一步走

    首先,您的YAML文件格式不正确,应该是这样的:

    properties:
      sports:
        football:
          - Team1
          - Team2
          - Team3
        basketball:
          - Team4
          - Team5
          - Team6
      settings:
        football:
          period1: 45
          period2: 90
          players: 11
        basketball:
          periods: 4
          players: 5
    

    然后,您的配置属性将如下所示:

    @ConfigurationProperties(prefix = "properties", locations = "classpath:sports.yml")
    public class SportsProperties {
    
        private Map<SportsEnum, List<TeamsEnum>> sports;
        private Map<SportsEnum, Map<SportSettingsEnum, String>> settings;
    
        public Map<SportsEnum, List<TeamsEnum>> getSports() {
            return sports;
        }
    
        public void setSports(Map<SportsEnum, List<TeamsEnum>> sports) {
            this.sports = sports;
        }
    
        public Map<SportsEnum, Map<SportSettingsEnum, String>> getSettings() {
            return settings;
        }
    
        public void setSettings(
            Map<SportsEnum, Map<SportSettingsEnum, String>> settings) {
            this.settings = settings;
        }
    
        @PostConstruct
        public void customManipulation() {
            System.out.println(sports);
            System.out.println(settings);
        }
    }
    

    接下来,应在配置中启用这些属性:

    @SpringBootApplication
    @EnableConfigurationProperties(SportsProperties.class)
    public class YamlSampleApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(YamlSampleApplication.class, args);
        }
    
    }
    

    应该是这样的,真的。以下是我的列举:

    public enum SportsEnum {
        football, basketball
    }
    
    public enum TeamsEnum {
        Team1, Team2, Team3, Team4, Team5, Team6
    }
    
    public enum SportSettingsEnum {
        periods, period1, period2, players
    }
    

    以下是我在日志中得到的输出:

    2016-07-26 17:44:41.226 DEBUG 30015  - [           main] s.b.e.YamlPropertySourceLoader$Processor : Loading from YAML: class path resource [sports.yml]
    2016-07-26 17:44:41.282 DEBUG 30015  - [           main] s.b.e.YamlPropertySourceLoader$Processor : Matched document with default matcher: {properties={sports={football=[Team1, Team2, Team3], basketball=[Team4, Team5, Team6]}, settings={football={period1=45, period2=90, players=11}, basketball={periods=4, players=5}}}}
    2016-07-26 17:44:41.282 DEBUG 30015  - [           main] s.b.e.YamlPropertySourceLoader$Processor : Loaded 1 document from YAML resource: class path resource [sports.yml]
    {football=[Team1, Team2, Team3], basketball=[Team4, Team5, Team6]}
    {football={period1=45, period2=90, players=11}, basketball={periods=4, players=5}}