Kon*_*ine 5 java spring spring-boot
我正在寻找一种方法来操纵@ConfigurationProperties在初始化时定义的方法,以便在@Inject / @Autorwired使用@Bean方法配置的对象正确配置时。
场景:
我在.yml文件中设置了一堆属性。因为所有这些属性都匹配为字符串,所以其中一些需要特殊处理才能正确配置为各自的类型(其中一些是枚举)。我是否使我的属性对象a @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"
Run Code Online (Sandbox Code Playgroud)
这些与以下对象匹配:
Map<SportsEnum, List<TeamsEnum>
Map<SportsEnum, Map<SportSettingsEnum, String>>
Run Code Online (Sandbox Code Playgroud)
TL; DR:我想从.yml/.properties文件中获取配置的对象并操纵其可注射表示。请提供具体示例!
这绝对是支持的,我的猜测是你做错了什么。让我们一步一步来。
首先,您的 YAML 文件格式不正确,它应该如下所示:
properties:
sports:
football:
- Team1
- Team2
- Team3
basketball:
- Team4
- Team5
- Team6
settings:
football:
period1: 45
period2: 90
players: 11
basketball:
periods: 4
players: 5
Run Code Online (Sandbox Code Playgroud)
然后,您的配置属性将如下所示:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,应在您的配置中启用这些属性:
@SpringBootApplication
@EnableConfigurationProperties(SportsProperties.class)
public class YamlSampleApplication {
public static void main(String[] args) {
SpringApplication.run(YamlSampleApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
应该是这样,真的。这是我的枚举:
public enum SportsEnum {
football, basketball
}
public enum TeamsEnum {
Team1, Team2, Team3, Team4, Team5, Team6
}
public enum SportSettingsEnum {
periods, period1, period2, players
}
Run Code Online (Sandbox Code Playgroud)
这是我在日志中得到的输出:
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}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2020 次 |
| 最近记录: |