Je crée une classe pojo et stocke la variable application.properties mais j'obtiens des valeurs nulles
REMARQUE: je dois accéder à env depuis ma classe abstraite
Classe POJO
XXX
Classe d'initialisation avec @autowired
app.notif.key=jkashdkjashd app.notif.url=https/some.url
classe concrète qui s'étend à ma NotificationBaseClass
@Component
@Qualifier("androidNotification")
public class AndroidNotification extends NotificationBase implements Notification {
public AndroidNotification(String message, String title, String datalink, List<String> instanceIds) {
super(message, title, datalink, instanceIds);
}
AndroidNotification(){
super();
}
@Override
public void send() {
this.getEnv();
}
}
application.properties
public abstract class NotificationBase {
@Autowired
NotificationEnvironment notificationEnvironment;
public void getEnv(){
system.out.println(notificationEnvironment.getKey()); // null value
}
}
3 Réponses :
Vous pouvez auto wire @ Classe de configuration de la classe @Configuration
La classe @Configuration peut référencer l'instance de n'importe quelle autre classe @Configuration en utilisant @Autowired. Cela fonctionne car les classes @Configuration elles-mêmes sont instanciées et gérées en tant que beans Spring individuels.
Créez votre classe @Component et ajoutez une valeur de préfixe dans @ConfigurationProperties, comme ceci. Cela fonctionne pour moi, j'espère que cela fonctionnera pour vous aussi.
@Component
public class NotificationBase {
private static NotificationEnvironment notificationEnvironment;
@Autowired
public NotificationBase(NotificationEnvironment notificationEnvironment){
this.notificationEnvironment = notificationEnvironment;
}
public static void getEnv(){
System.out.println(notificationEnvironment.getKey()); // null value
}
Vous pouvez utiliser ces propriétés comme ceci:
@Component
@ConfigurationProperties(prefix = "app.notif")
public class NotificationEnvironment {
private String key;
private String url;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
} p>
Voici celle de la définition de classe concrète mentionnée par l'auteur de l'OP.
@RestController
public class ArticleCommentController {
@Autowired
ConcreteNotification concreteNotification;
@RequestMapping(value = "/health_check", method = RequestMethod.GET)
public void getDemo() {
concreteNotification.getEnv();
}
}
Mise à jour de NotificationBase comme ci-dessous
public abstract class NotificationBase {
NotificationEnvironment notificationEnvironment;
public NotificationBase(NotificationEnvironment notificationEnvironment) {
this.notificationEnvironment = notificationEnvironment;
}
public void getEnv(){
System.out.println(notificationEnvironment.getKey());
}
}
La classe de contrôleur J'utilise pour obtenir les valeurs de configuration
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ConcreteNotification extends NotificationBase {
@Autowired
public ConcreteNotification(NotificationEnvironment notificationEnvironment) {
super(notificationEnvironment);
}
}
sortie:
jkashdkjashd
Je n'ai toujours pas mon environnement
Ensuite, il peut y avoir un autre problème lié à Spring Config, pour référence: GithUB.com/dineshbhagat / Spring-Boot-Web-JPA , utilisé de la même manière qu'il est dans GitHub Repo.
si possible pouvez-vous partager du code dans github, vérifiera
J'ai obtenu ma propriété avec @Autowire dans la méthode d'exécution CommandLineRunner mais ne fonctionne pas dans mes classes concrètes
Je l'ajoute au fichier application.properties et je peux l'obtenir à partir de là. peut être pour commencer, ajoutez-le dans application.properties puis allez pour l'argument de ligne de commande avec le drapeau -D
J'ai une classe d'usine qui retourne mes classes concrètes, je peux aussi obtenir mon environnement dans ma classe d'usine avec @Autowire. Je pense à cause de cette initialisation: retourne une nouvelle notification Android (message, titre, liaison de données, instanceIds); Je pense que c'est la raison pour laquelle je ne peux pas obtenir mon environnement
vous devez ajouter public NotificationBase (NotificationEnvironment notificationEnvironment) {this.notificationEnvironment = notificationEnvironment; } dans NotificationBase.java
également @Autowired public ConcreteNotification (NotificationEnvironment notificationEnvironment) {super (notificationEnvironment); } dans ConcreteNotification.java
fonctionne bien pour moi, pouvez-vous ajouter, comment le testez-vous.
Si vous accédez à partir de la classe
notificationbase code>, car il s'agit de la classe abstraite, il ne ajoutera pas @Autowired dépendances, ce ne sera pas abstrait et chèque, et ajouter@Component code>, cela devrait Travailler bien.@dkb ne sais pas pourquoi cela ne fonctionne pas pour moi, je suis coincé sur ce problème. en utilisant postman pour tester mon api, j'ai eu une erreur avec l'exception de pointeur null java.
@dkb J'étends ma classe NotificationBase à mes deux classes concrètes qui partagent les mêmes attributs. J'ai besoin que cela soit abstrait et j'appelle la méthode getEnv. avez-vous une autre suggestion?
si possible pouvez-vous s'il vous plaît ajouter, une des définitions de classe concrètes en question.
Le câblage automatique ne fonctionnera que dans les haricots de printemps. si les classes s'étendant de
NotificationBasene sont pas des spring beans mais gérées par vous-même en effectuantnew MyExtendedNotificationBaseautowiriung ne fonctionnera pas.déjà ajouté @dkb j'ai édité mon code désolé pour la méthode void non sens
M.Deinum mes classes concrètes ont une annotation @Component est-ce que cela n'est pas compté comme bean?
Vérifiez ceci: stackoverflow.com/a/57752654/2987755 , devrait fonctionner correctement