Manipulating configuration properties in spring

I am looking for a way to manipulate @ConfigurationProperties, defined during initialization, so that when I @Inject / @Autorwiredconfigured a object using a method @Bean, it is correctly configured.

Scenario:

I have a set of properties set in a file .yml. Since all these properties correspond to Strings, some of them require special processing to correctly configure their respective types (some of them are listed). Can I make a properties a object @Componentand then embed it in a method @Beanand modify it? I tried to combine annotations @Beanand @ConfigurationProperties, but the object is configured AFTER the method @Beanreturns, so any manipulations are lost / impossible. What is the best way to do this?

Example: In mine .yml, I have this:

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"

And they correspond to the following objects:

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

TL DR: I want to take an object configured from a file .yml/.propertiesand manipulate its injection representation. Please provide a specific example!

+4
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}}
+3

Source: https://habr.com/ru/post/1649123/


All Articles