0
votes

Obtenir la valeur null de @configuration

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


9 commentaires

fonctionne bien pour moi, pouvez-vous ajouter, comment le testez-vous.


Si vous accédez à partir de la classe notificationbase , 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 , 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 NotificationBase ne sont pas des spring beans mais gérées par vous-même en effectuant new MyExtendedNotificationBase autowiriung 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


3 Réponses :


0
votes

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.


0 commentaires

0
votes

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>


0 commentaires

0
votes

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


8 commentaires

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