[JAVA] Je souhaite lire le fichier de propriétés avec un nom de fichier autre que application.yml ou application- [nom du profil] .yml avec Spring Boot

C'est plutôt bien! Je n'ai pas pu trouver l'échantillon, alors prenez note.

Ce que je voulais faire

--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.

Méthode de réalisation

point

--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.

Code source

Le code source complet est ici [https://github.com/h-okhs/SpringPropertySourceExample)

Classe de configuration

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;
    }
}

Classe d'usine

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;
        }
    }
}

Contrôle de fonctionnement

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");

    }
}

prime

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 ...)

Échec de la résolution de l'espace réservé utilisé pour la valeur de @PropertySource dans SpringBoot 2.3.0 et versions ultérieures

Recommended Posts

Je souhaite lire le fichier de propriétés avec un nom de fichier autre que application.yml ou application- [nom du profil] .yml avec Spring Boot
[Spring Boot] Je veux ajouter mon propre fichier de propriétés et obtenir la valeur avec env.getProperty ().
[Spring Boot] Comment se référer au fichier de propriétés
Je souhaite pouvoir lire des fichiers en utilisant refile avec administrate [rails6]
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
Je souhaite surveiller un fichier spécifique avec WatchService
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Je souhaite utiliser la méthode de désinfection autre que View.
Je veux donner un nom de classe à l'attribut select
Je souhaite contrôler la taille de fichier maximale pour le téléchargement de fichiers pour chaque URL dans Spring Boot
Lisez le fichier sous le chemin de classe sous forme de chaîne de caractères avec ressort
Je veux contrôler le message d'erreur par défaut de Spring Boot
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
J'ai utilisé Docker pour solidifier le modèle à développer avec Spring Boot.
Je souhaite développer une application web!
Je souhaite obtenir une liste de chaînes de caractères uniques uniquement en excluant les chaînes de caractères fixes du nom de fichier
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
Connectez-vous aux applications Web Spring Boot sur la plate-forme Microsoft ID
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
De la création d'un projet Spring Boot à l'exécution d'une application avec VS Code
Comment se lier avec un fichier de propriétés dans Spring Boot
Je voulais classer la botte à ressort dans un multi-projet
Notez que j'étais accro au traitement par lots avec Spring Boot
Lors du téléchargement d'un fichier avec Spring Boot, la gestion des erreurs est effectuée lorsque la taille maximale du fichier est dépassée.
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
[Spring] Lire un message à partir d'un fichier YAML avec MessageSource
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Je souhaite afficher le nom de l'affiche du commentaire
Je souhaite utiliser le mode sombre avec l'application SWT
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
Je veux obtenir une liste du contenu d'un fichier zip et sa taille non compressée
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
J'ai essayé de moderniser une application Java EE avec OpenShift.
Je veux amener Tomcat sur le serveur et démarrer l'application
La première application WEB avec Spring Boot-Making a Pomodoro timer-
Une histoire remplie des bases de Spring Boot (résolu)
Je veux faire une liste avec kotlin et java!
[Java] Déployer l'application Spring Boot sur Azure App Service
Je veux appeler une méthode et compter le nombre
Déployez l'application créée par Spring Boot sur Heroku (public) ②
Je veux créer une fonction avec kotlin et java!
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Déployez l'application créée par Spring Boot sur Heroku (public) ①
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je veux créer un fichier Parquet même en Ruby
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Je veux passer la commande de démarrage à postgres avec docker-compose.
Que faire à propos de l'erreur "Impossible de lire ou n'est pas un fichier ZIP valide"
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot