C'est plutôt bien! Je n'ai pas pu trouver l'échantillon, alors prenez note.
--Faire en sorte que SpringBoot lise le fichier de propriétés yaml avec un nom de fichier autre que ʻapplication.yml --A ce moment, chargez un fichier avec un nom de profil attaché, tel que ʻapplication-test.yml
.
Dans une configuration multi-projets, je voulais mettre un fichier de propriétés côté projet où les parties communes étaient collectées, mais dans application.yml, il était nécessaire d'utiliser un autre nom car il battait le fichier de propriétés côté utilisateur.
--Spécifiez le fichier de propriétés à charger en utilisant @ PropertySource
dans la classe Configuration
-- @ PropertySource
ne prend pas en charge la lecture des fichiers yaml, créez donc une classe pour la lecture afin qu'elle puisse être lue.
Le code source complet est ici [https://github.com/h-okhs/SpringPropertySourceExample)
Spécifiez la classe de lecture de Yaml avec factory
of @ PropertySource
.
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;
}
}
Une source empruntée à quelque part.
Il semble que Yaml chargé à l'aide de YamlPropertiesFactoryBean
de Spring soit converti en Propriétés
et renvoyé en tant que PropertySource
.
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");
}
}
Avec SpringBoot 2.3.0 ou version ultérieure, «$ {spring.profiles.active}» de @ PropertySource ne peut pas être résolu et une erreur se produit. Je l'ai écrit dans un autre article. (J'ai mangé beaucoup de temps à cause de ça ...)
Recommended Posts