La lecture d'une carte à partir de données en Java se null
J'ai un problème dans la lecture de mon yaml par le biais de java, à l'aide de printemps. Laissez-moi vous montrer le premier code
@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "countries")
public class UserLimitReader {
private HashMap<String, Integer> orders;
private HashMap<String, Integer> requests;
public HashMap<String, Integer> getOrders() {
return orders;
}
public void setOrderRedeemableLimit(HashMap<String, Integer> orders)
{
this.orders= orders;
}
public HashMap<String, Integer> getRequests() {
return requests;
}
public void setMonthlyRedeemableLimit(HashMap<String, Integer> requests) {
this.requests= requests;
}
}
Mon fichier yaml:
cassandra:
hosts: localhost:9142, 127.0.0.1:9142
keyspace: test
countries:
orders:
JPY: 1000
USD: 1000
requests:
JPY: 100000
USD: 100000
Le printemps contexte xml a aussi ceci:
<bean id="yamlProperties"
class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources">
<value>classpath:config/application.yaml</value>
</property>
</bean>
<context:property-placeholder
properties-ref="yamlProperties" />
Maintenant, l'attente que j'ai(eu), c'est que, lors de l'exécution de mon ressort de l'application de test(le contexte xml est de mon test de ressources, le yaml est aussi dans mon test), ces valeurs de commandes et les demandes sont ensemble, mais ils sont nuls. Notez également qu'il y a d'autres valeurs dans mon yaml en plus de ce que je suis injection à l'aide de @Valeur(${...}), ils sont injectés absolument parfait!
J'ai regardé ce: Spring Boot - injecter de la carte de l'application.yml
J'ai fait pratiquement la même, mais encore, mes valeurs ne sont pas définies. Aide gentiment.
J'ai été en passant par google, trouvé ce lien:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/YamlPropertiesFactoryBean.html
Dans ce, dit-il, tout est à lire comme une chaîne et non une carte. Est-il une autre classe qui prend en charge la lecture de fichier Yaml la façon dont ils l'ont fait ici: Spring Boot - injecter de la carte de l'application.yml
Ou est ma compréhension de YamlPropertiesFactoryBean mal?
compile 'org.springframework:spring-core:4.2.+'
compile 'org.springframework:spring-beans:4.2.+'
compile 'org.springframework:spring-context:4.2.+'
compile 'org.springframework.boot:spring-boot:1.3.1.RELEASE'
compile 'org.springframework.boot:spring-boot-configuration-processor:1.3.1.RELEASE'
Ce sont les dépendances de gradle. Vous demandez peut-être pourquoi j'ai printemps-core et spring-boot, pour l'essentiel, je ne veux pas le printemps-démarrage, mais sans ressort-boot, je n'ai pas à ajouter @EnableConfigurationProperties et @ConfigurationProperties, honnêtement, je ne sais pas si je peux lire le fichier yaml contenu dans une carte sans eux. D'où ces deux dépendances sont ajoutés, mais si il y a un moyen de les éliminer, je serais plus qu'heureux de supprimer ces deux dépendances.
Cordialement,
Pavan
Salut Coby, C'est la partie du printemps, qui le charge: <bean id="yamlProperties" class="org.springframework.les haricots.usine.config.YamlPropertiesFactoryBean"> <property name="ressources"> <valeur>classpath:config/application.yaml</valeur> </propriété> </bean> <contexte:biens immobiliers-propriétés de l'espace réservé-ref="yamlProperties" /> Le fait est que pour mes autres haricots, <bean id="DatabaseConnector" class="com.rakuten.point.aldebaran.cassandra.connecteur.mettre en oeuvre.DatabaseConnectorImpl"> <property name="hôtes" value="${cassandra.les hôtes}"></propriété> </bean> Ici, il devient chargé!
Mais je ne peux pas faire la même chose pour UserLimitReader, car il jette toujours un message d'erreur disant, ne peut pas résoudre place de titulaire pays.les commandes mentionnées dans "${pays.les commandes}"
Veuillez vérifier mon commentaire à propos de comment lire fichier YAML au Printemps et à l'inclure dans JUnit et TestNG test ici: stackoverflow.com/a/37270778/3634283
Cette question était plus dans la lecture des entrées directement dans une carte. Mais le vôtre est de la lecture de yaml, qui aide, mais peut-être pas dans ce scénario. Mais il aide vraiment et je pense que la solution a été fournie par Coby qui m'a aidé à résoudre le problème.
OriginalL'auteur Pavanraotk | 2016-01-09
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème avec différents types génériques et je l'ai résolu par l'initialisation de la carte de membre et de supprimer la méthode de définition, par exemple:
Veuillez noter que j'ai utilisé java 7 diamants de l'opérateur et de modifier le type de membre à la Carte au lieu de la table de hachage.
IMPORTANT: Dans mon code, j'utilise du Printemps de la configuration de la classe au lieu de XML et déplacé le
EnableConfigurationProperties
à la configuration de la classe. Dans votre cas, il doit être quelque chose comme:Ne sais pas comment vous le configurer à l'aide de XML, cependant comme je l'ai écrit dans mes commentaires, je pense toujours que vous devriez assurez-vous que le Printemps trouve votre classe à l'aide de composants d'analyse ou quelque chose de semblable.
@Value
de travail, comme le Printemps des charges le fichier YAML sans problème à l'aide de votre fichier de contexte, toutefois, cela ne signifie pasUserLimitReader
fichier est chargé et configuré par le Printemps.C'était la seule solution qui a fonctionné pour moi... Pourquoi la simple auto-cartographie via propriété non initialisée et les getter/setter ne fonctionne pas? Quelqu'un at-il une explication? THX
OriginalL'auteur Koby