Ich arbeite an einem vorhandenen Code, der einen Controller verwendet, um eine Methode auf dem zweiten Controller aufzurufen. Es gibt 2 Implementierungen, die ich bisher gesehen habe.
1. Implementierung
%Vor%2. Implementierung
%Vor%Welche ist die richtige Implementierung, welche Probleme gibt es bei beiden?
Die bloße Tatsache, dass Sie eine Methode von einem anderen Controller aufrufen müssen, zeigt einen möglichen Konstruktionsfehler.
Mit Option 1 verlieren Sie alles, was Ihnen der Spring DI-Container gebracht hat: nämlich, dass der andere Controller von Spring instanziiert werden kann, wobei einige andere Abhängigkeiten darin verdrahtet sind. Wenn Sie es selbst instanziieren, selbst wenn es in diesem Moment funktioniert, weil Sie wahrscheinlich keine Abhängigkeiten von @Autowired / @Value haben, wird es unterbrochen, sobald Sie Abhängigkeiten zu anderen Ressourcen hinzufügen. Außerdem haben Sie bereits eine Instanz, die der Container für Sie erstellt, warum andere erstellen?
Klingt so, als müssten Sie den Code umgestalten. Extrahieren Sie, was zwischen den zwei Controllern in einer separaten Klasse gemeinsam ist, und rufen Sie dann das von beiden Controllern auf.
Wenn Sie zwischen Controllern einen Aufruf ausführen, liegt entweder ein Fehler vor oder Sie möchten eine Umleitung vornehmen, die absolut gültig ist. Wenn Umleitung der Fall ist, kehren Sie einfach in Ihrer Controller-Methode wie folgt zurück:
%Vor% Sie machen völlig falsch. Siehe Costi Ciudatu's
antwort für was falsch ist.
Lösung: Ich rate Ihnen, service layer and dao layer classes
mit Ihrem controllers
zu verknüpfen.
Angenommen, Sie haben AccountController
, dann haben Sie AccountService
class (Schnittstelle + Implementierung) und AccountDao
(Schnittstelle + Implementierung).
Nun, wenn sich der Benutzer anmeldet ( LoginController
) und Sie ein Konto benötigen, damit Sie AccountService
in LoginController
automatisch einrichten, erhalten Sie die Benutzerkontendetails von AccountService
methods.
Der erste benötigt mehr Arbeit. Erstens möchten Sie wirklich jedes Mal eine neue Instanz der Controller-Klasse erstellen?
Die zweite verwendet ein Muster, das als Abhängigkeitsinjektion oder Inversion der Kontrolle bekannt ist, die netter ist. Lassen Sie Spring den Bereich der Bean für Sie verwalten, standardmäßig wird nur eine Instanz der Controller-Klasse erstellt. Wenn Sie jedoch aus irgendeinem Grund dieses Verhalten nicht möchten, können Sie einfach viele Instanzen erstellen ...
Der zweite ist korrekt, weil Sie nicht jedes Mal eine Instanz davon machen werden. Die @Autowired-Annotation fügt das Objekt bei Bedarf in Ihren Code ein.
Überprüfen Sie dies Ссылка
Aber es gibt eine @Controller-Anmerkung, die Sie für Controller und @Service für Beans verwenden sollten, die Sie automatisch ansteuern möchten.
Tags und Links java spring spring-mvc