0
votes

Créer un objet de haricot @service, est-il possible?

J'ai une application reposante avec tout le service @ Service, @ RestController, @ haricots du référentiel. et des haricots obligés de messagerie automatique.

Maintenant, je veux utiliser la classe @service dans une autre classe qui n'est pas gérée au printemps, est-ce possible? P>

Ces 2 classes sont également dans 2 projets mavenaires différents si Cela rend toute différence p>

J'ai essayé de créer un nouvel objet, comme prévu sans vendre. J'ai également essayé de créer des constructeurs différents aussi sans s'entendre. P>

J'ai googlé pour certains anwsers, mais je n'ai pas trouvé que maintenant je me tourne vers vos experts;) p>

La classe que je veux Utilisez! P>

public static void main(String[] args) {
    String chromeDriver = args[0];
    String method = args[1];
    String domainName = args[2];
    ProductService service =  new ProductService();
    System.setProperty("webdriver.chrome.driver", chromeDriver);
    Runner runner = new Runner(method,domainName);
    runner.run();
}


7 commentaires

Qu'est-ce qui vous empêche d'utiliser de nouveaux produits? Dans la méthode principale, essayez-vous d'avoir l'intention d'avoir un haricot géré de printemps de produits de produits avec productretrepository injecté /


Votre méthode principale est-elle exécutée dans un projet de printemps?


@ Martin'Srun Je suppose que je veux utiliser les méthodes de la classe de produitsVice pour pouvoir utiliser des fonctions CRUD dans Repo. Pour autant que je sache, j'ai besoin d'accéder à productrexitory, j'ai besoin d'un objet Produitservice.


@Kayaman non ce n'est pas un projet de printemps


Ensuite, il n'a aucune idée de @autowired ou quel @service est. Le référentiel ne fonctionnera pas, car il s'appuie sur la "magie de printemps". Donc, en bref, non, vous ne pourrez pas utiliser ces classes directement à partir de votre méthode principale .


Si la méthode principale n'a pas de contexte de printemps, vous ne pouvez pas obtenir un haricot géré de printemps. Vous devrez créer manuellement des producteurs et la définir dans votre objet ProduitsVice.


@ Martin'Srun Vous ne pouvez pas créer de référentiel manuellement, car c'est une interface. Cela tente de pousser une cheville carrée dans un trou rond, ne fonctionnera tout simplement pas.


3 Réponses :


0
votes

Autant que je sache, vous pouvez instancier une classe gérée à ressort dans une classe non gérée à ressort aussi longtemps que la classe gérée à ressort (dans ce cas le service) ne contient aucune dépendance de printemps. Comme ceux-ci resteront NULL (non initialisés) parce qu'ils ne seront jamais injectés au printemps.

Votre service semble bon envers moi car le champ producteur n'est pas @Autowired, mais dans votre code, vous créez le fournisseur comme celui-ci: xxx

tandis que ce constructeur sans paramètre n'existe pas dans la classe de fournissements: xxx


6 commentaires

J'ai essayé avec un constructeur de base aussi et un câblage automatique le champ directement et donne un NullPoinger sur le service. Pour autant que je sache, si vous utilisez AutoWire Tout tout connecté doit également être autonome. Mais pourrait être faux là-bas


Que voulez-vous dire "câbler automatiquement le champ directement"? Si vous souhaitez l'exécuter dans un contexte de printemps, le référentiel du service doit être un champ autonome ainsi que le service dans le contrôleur. Si vous voulez l'exécuter dans un contexte non printanier, il n'y a pas de towoEd. Vous devez créer un nouveau référentiel (tant que le référentiel n'a pas de champs autonomes), puis créez un nouveau service avec le référentiel comme paramètre.


Je veux dire ne pas changer le constructeur mais le référentiel de terrain. Je ne peux pas créer de nouveau référentiel car il s'agit d'une interface et que vous ne pouvez pas être instancié. Comment voulez-vous dire que je devrais créer un nouveau référentiel?


Vous devez avoir une implémentation concrète de l'interface productrice, non?


Eh bien, je voulais seulement accéder au Produitservice d'un projet de non-Spring afin que je puisse utiliser la magie de printemps avec du projecteur, mais cela ne semble pas fonctionner. Donc oui je suppose que j'ai besoin d'une mise en œuvre concrète


Vous ne pouvez pas vous attendre à une injection de dépendance de printemps sur un objet qui n'est pas géré au printemps. Dès que vous le ferez "de nouveaux produits ()", vous pouvez oublier le printemps.



0
votes

Je pense que cela n'est pas possible (je veux dire, c'est techniquement, mais cela ne va pas fonctionner).
Pour avoir accès à votre classe de services, votre deuxième application doit avoir accès au même contexte de printemps .

C'est parce que le contexte de printemps dans votre application de base définit les dépendances nécessaires que votre deuxième application n'a pas accès à. L'un des exemples de cet article est ProductrePositoritoritoritoricitory (qui est une solution de démarrage à ressort de manière à discuter avec la base de données), n'a aucun contexte de ressort et donc des informations sur dB Emplacement et URL de connexion .

Dans votre cas, vous devez reproduire la classe et le mécanisme pour se connecter à DB avec la configuration de DB dans votre deuxième projet.


2 commentaires

Donc, je dois faire le repo et la configuration db manuellement? Ou puis-je faire ma méthode principale une application de printemps de manière simple, donc il a le même contexte de printemps?


Même si vous faites votre nouveau projet une application de printemps, il aura un contexte de printemps séparé. Donc, oui, vous devez faire le repo et la configuration DB manuellement.



0
votes

Il y a une solution de contournement pour "injecter" em> dépendances manuellement. Créez un composant géré qui stocke la référence à l'applicationContext dans une variable statique, de sorte que vous puissiez accéder à partir de classes non gérées:

public class NoManagedClass {

    private final ManagedClass bean;

    public NoManagedClass() {
       this.bean = ApplicationContextProvider.applicationContext().getBean(ManagedClass.class);
    }
}


1 commentaires

Merci mais j'ai plutôt fait un client pour le service de printemps.