Herunterladen oder Redirect mit Fehlermeldung zu einer anderen Controller-Aktion in Spring Web MVC

8

Idee : Ich habe eine Spring-Web-MVC-Aktion, die eine oder beide dieser Aufgaben erfüllen soll:

  • Laden Sie eine Datei von einem Remote-Server herunter und schreiben Sie den Eingabestream in den Antwort-Ausgabestream
  • Oder fangen Sie die Ausnahme des Downloads ab, legen Sie eine von mehreren Fehlermeldungen fest und leiten Sie sie auf die Seite / addresses um. Auf der Adressseite wird der Fehler
  • angezeigt

Problem : Der Frühling ist nicht in der Lage, eine Datei und leiten im Fall eines Problems zum Download - irgendwie blinken Attribute funktionieren nicht, weil das in der Umleitung verloren gehen:

%Vor%

JSP-Seite von / Adressen:

%Vor%

Frage : Wie kann ich die Fehlermeldung (einfache Zeichenfolge zum Beispiel) auf der Seite / addresses anzeigen? Arbeiten mit verschiedenen URL-Parameter (error = Fehlera, error = errorb ...) ist ein großer Schmerz, wenn es mehrere Fehlertypen und das Bestehen der Fehlermeldung sind als GET-Parameter sieht unprofessionell und ist die Wurzel der Codierung Probleme.

    
swaechter 09.11.2015, 20:45
quelle

4 Antworten

7

Was Sie brauchen, ist die RedirectAttributes Spezialisierung von Model , mit der die Controller Attribute für ein Umleitungsszenario auswählen können. Für ein funktionierendes Beispiel siehe folgenden Code:

%Vor%     
Babl 18.11.2015, 13:49
quelle
1

Ich kann nicht erklären, warum es keine Datei vom Server herunterlädt, sondern zu Ihrer zweiten Abfrage kommt. Sie können auf zwei Arten umleiten, indem Sie entweder den Rückgabetyp Ihrer Methode als ModelAndView verwenden und das tun

%Vor%

dann zurück mav. So können Sie die Anzahl der gewünschten Seiten umleiten, falls dies der Fall ist.

und zweiten Ansatz können Sie Ihre Methode Rückgabetyp String nehmen und Sie können direkt auf Ihre erforderlichen jsp umleiten.

    
suri 10.11.2015 06:46
quelle
1

Update: Ich dachte, die Frage beträfe Situationen, in denen RedirectAttributes nicht verfügbar sind, weil die Lösung sonst ziemlich offensichtlich ist (benutze RedirectAttributes ).

Ursprüngliche Antwort:

Ich verwende den folgenden Code, um Nachrichten an die Flash-Map in Situationen zu binden, in denen Spring RedirectAttributes nicht unterstützt (z. B. in ExceptionHandler Methoden):

%Vor%

Dabei ist Feedback / FeedbackContainer ein Container für Nachrichten, auf die dann in JPS über JSON-Serialisierung zugegriffen wird. In Ihrem Fall können Sie eine einfache Zeichenfolge mit dem Schlüssel "error" verwenden und direkt auf die JSP zugreifen:

%Vor%

Der Hauptgrund für die Verwendung meines eigenen Nachrichtencontainers ist die Möglichkeit, mehrere Nachrichten mit verschiedenen Ebenen und zusätzlichen getInstance -Methoden für RedirectAttributes , Model oder ModelMap zu haben, also muss ich mich nicht darum kümmern doppelte Feedback-Bindungen und / oder der unterschiedliche Bindungscode.

    
Robin 16.11.2015 16:09
quelle
0

Ich würde den folgenden Ansatz vorschlagen: Da Sie eine Remote-Datei als Eingabestream haben, können Sie sie nicht an dem Punkt lesen, an dem eine Ausnahme aufgetreten ist. Daher können Sie die Fehlerwahrscheinlichkeit verringern, indem Sie zuerst die Datei in einen temporären Ordner auf dem lokalen Host herunterladen.

Wenn hier ein Fehler auftritt, können Sie entweder wie vorgeschlagen umleiten oder nach mehreren fehlgeschlagenen Versuchen einen weiteren Versuch durchführen und umleiten. Auf diese Weise schreiben Sie nichts in den Stream, bis Sie sicher sind, dass die Datei erfolgreich heruntergeladen wurde.

Sobald die Datei auf den Server heruntergeladen wurde, können Sie sie an den Client übergeben. Zum Beispiel können Sie Bytes lesen und die aktuelle Position speichern. Angenommen, es gibt eine Ausnahme während des Schreibens in den Stream. Sie können Schreiben von fehlgeschlagenen Punktlesungen aus der Mitte wiederherstellen.

Ein kleines Beispiel

%Vor%

safeWrite sollte das Lesen von lokalen Dateien beim Lesen aus der Dateimitte unterstützen. Es sollte Standard-Java API für solche Operationen geben.

    
Kuvaldis 18.11.2015 13:52
quelle