Spring MVC, einen anderen Controller aus einem Controller aufrufen

7

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?

    
3coins 11.10.2012, 20:55
quelle

6 Antworten

9

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?

    
Costi Ciudatu 11.10.2012, 21:46
quelle
9

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.

    
MarkOfHall 11.10.2012 21:38
quelle
9

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%     
Diego Duarte 29.05.2013 16:51
quelle
4

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.

    
Nandkumar Tekale 12.10.2012 06:32
quelle
1

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

    
ramsinb 11.10.2012 21:00
quelle
0

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.

    
fonZ 11.10.2012 20:58
quelle

Tags und Links