J'ai une application Spring Boot où les propriétés doivent être lues à partir d'un fichier yaml.
code:
app.max.size=10
fichier yaml
app:
max:
size: 10
Quand j'essaye cela, ça ne marche pas J'obtiens la valeur de app.max.size comme null. Pour size , j'obtiens la valeur 10.
Quand j'utilise application.properties. Je peux obtenir le résultat souhaité. Est-ce que je fais quelque chose de mal?
application.properties
@Component
@PropertySource("classpath:application.yml")
public class ResourceProvider {
@Autowire
private Environment env;
public String getValue(String key) {
return env.getProperty("app.max.size");
}
}
3 Réponses :
Vous pouvez lire la valeur par:
@Value("${app.max.size}")
private String size;
public String getValue(String key) {
return size;
}
J'ai plusieurs propriétés et je ne veux pas définir de variables pour cela. De nouvelles propriétés peuvent être ajoutées et ne veulent pas modifier ce fichier.
de la documentation:
Les fichiers YAML ne peuvent pas être chargés à l'aide de l'annotation @PropertySource. Donc, dans le cas où vous auriez besoin de charger des valeurs de cette façon, vous devez utiliser un fichier de propriétés.
Puisque vous utilisez le fichier application.yml , vous n'avez pas besoin de charger manuellement le fichier dans le contexte car il s'agit du fichier de configuration par défaut pour l'application spring . Vous pouvez simplement les utiliser dans une classe décorée @Component comme ci-dessous;
@Component
@PropertySource(value = "classpath:config-prop.yml", factory = YamlPropertySourceFactory.class) // Note the file name with the extension unlike a property file. Also, it's not the `application.yml` file.
public class ResourceProvider {
@Value("${app.max.size}")
private int size;
}
Si vous créez un fichier YAML personnalisé, alors ceci est encore un énorme problème au printemps. En utilisant @PropertySource , vous ne pouvez pas charger simplement des fichiers YAML. C'est possible, mais peu de travail est requis. Vous avez d'abord besoin d'une fabrique de source de propriété personnalisée. Dans votre cas, fabrique de source de propriété YAML personnalisée.
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;
import java.util.Properties;
public class YamlPropertySourceFactory implements PropertySourceFactory {
/**
* Create a {@link PropertySource} that wraps the given resource.
*
* @param name the name of the property source
* @param resource the resource (potentially encoded) to wrap
* @return the new {@link PropertySource} (never {@code null})
* @throws IOException if resource resolution failed
*/
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource)
throws IOException {
Properties properties = load(resource);
return new PropertiesPropertySource(name != null ? name :
Objects.requireNonNull(resource.getResource().getFilename(), "Some error message"),
properties);
}
/**
* Load properties from the YAML file.
*
* @param resource Instance of {@link EncodedResource}
* @return instance of properties
*/
private Properties load(EncodedResource resource) throws FileNotFoundException {
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
} catch (IllegalStateException ex) {
/*
* Ignore resource not found.
*/
Throwable cause = ex.getCause();
if (cause instanceof FileNotFoundException) throw (FileNotFoundException) cause;
throw ex;
}
}
}
Et, vous devez dire à l'annotation @PropertySource d'utiliser cette fabrique au lieu de celle par défaut chaque fois que vous l'utilisez comme ci-dessous;
XXX
Vous pouvez utiliser vos propriétés indiquées dans la variable size de l'extrait de code ci-dessus.
Cependant. Si vous utilisez une déclaration de tableau YAML pour obtenir des propriétés, ce serait un peu étrange même si vous utilisez cette méthode.
Merci d'avoir répondu. Je suppose que je vais devoir l'utiliser. Mais je cherchais quelque chose où je n'ai pas à implémenter PropertySourceFactory
pour le fichier yml, cela fonctionnera également. vérifiez votre dossier. est-ce yml ou yaml?
@PropertySource ("classpath: application.yml") typo
@sajib, j'ai essayé à la fois avec .yml et .yaml, obtenant toujours null. Si j'essaye
app, j'obtiens une chaîne vide comme résultat.@dassum, quelle est la faute de frappe? s'il y avait eu une faute de frappe, comment puis-je obtenir une valeur pour
size?Lisez la documentation de Spring Boot. Il lira automatiquement les fichiers
yamlselon la convention correcte.Ce sera yml. Le fichier yml et le fichier de propriétés existent-ils dans le même chemin? Le fichier yml fonctionne bien dans mon projet