Das ist ziemlich gut! Ich konnte die Probe nicht finden, machen Sie sich also eine Notiz.
application.yml
lesenIn einer Konfiguration mit mehreren Projekten wollte ich eine Eigenschaftendatei auf der Projektseite platzieren, auf der gemeinsame Teile gesammelt wurden. In application.yml musste jedoch ein anderer Name verwendet werden, da die Eigenschaftendatei auf der Benutzerseite angezeigt wurde.
@ PropertySource
unterstützt das Lesen von Yaml-Dateien nicht. Erstellen Sie daher eine Klasse zum Lesen, damit sie gelesen werden kann.Der vollständige Quellcode finden Sie hier [https://github.com/h-okhs/SpringPropertySourceExample]
Geben Sie die Klasse zum Lesen von Yaml mit factory
von @ PropertySource
an.
FooConfig.java
@Configuration
@ConfigurationProperties(prefix = "foo")
@Component
@PropertySource(value = {"classpath:/foo-config.yml",
"classpath:/foo-config-${spring.profiles.active}.yml"},
factory = YamlPropertySourceFactory.class)
@Data
public class FooConfig {
private BarConfig bar;
private BazConfig baz;
@Data
public static class BarConfig {
private String setting1;
}
@Data
public static class BazConfig {
private String setting1;
private String setting2;
}
}
Quelle von irgendwo entlehnt. Es scheint, dass Yaml, das mit Spring's "YamlPropertiesFactoryBean" geladen wurde, in "Properties" konvertiert und als "PropertySource" zurückgegeben wird.
YamlPropertySourceFactory.java
public class YamlPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource)
throws IOException {
Properties propertiesFromYaml = loadYamlIntoProperties(resource);
String sourceName = name != null ? name : resource.getResource().getFilename();
return new PropertiesPropertySource(sourceName, propertiesFromYaml);
}
private static Properties loadYamlIntoProperties(EncodedResource resource)
throws FileNotFoundException {
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
} catch (IllegalStateException e) {
Throwable cause = e.getCause();
if (cause instanceof FileNotFoundException) {
throw (FileNotFoundException) e.getCause();
}
throw e;
}
}
}
SpringPropertySourceTest.java
@SpringBootTest
@ActiveProfiles("test")
public class SpringPropertySourceTest {
@Autowired
FooConfig fooConfig;
@Test
public void test() {
assertThat(fooConfig.getBar().getSetting1()).isEqualTo("barbar1");
assertThat(fooConfig.getBaz().getSetting2()).isEqualTo("bazbaz2");
}
}
Mit SpringBoot 2.3.0 oder höher kann @ PropertySources $ {spring.profiles.active}
nicht behoben werden und es tritt ein Fehler auf. Ich habe es in einem anderen Artikel geschrieben. (Ich habe deswegen viel Zeit gegessen ...)