2015-03-16 15 views
40

Ich habe einen REST-Endpunkt mit Spring MVC @RestController implementiert. Irgendwann, hängt von den Eingabeparametern in meinem Controller ab, muss ich http Redirect auf dem Client senden.Spring MVC @RestController und Redirect

Ist es möglich mit Spring MVC @RestController und wenn ja, könnten Sie bitte ein Beispiel zeigen?

+1

http://stackoverflow.com/questions/9311940/redirect-to-dynamic-url-in-spring-mvc – kamokaze

+2

Ihr linked Post ist nicht für '' '@ RestController''' Klassen, weil es' '' enthält @ ResponseBody'''. Ihre "redirect:" - Zeichenfolge würde nicht als Ansicht interpretiert. – Jan

Antwort

66

einen HttpServletResponse Parameter auf Ihre Handler-Methode hinzufügen dann response.sendRedirect("some-url");

Etwas nennen wie:

@RestController 
public class FooController { 

    @RequestMapping("/foo") 
    void handleFoo(HttpServletResponse response) throws IOException { 
    response.sendRedirect("some-url"); 
    } 

} 
+0

Leider sieht das wie die einzige Lösung aus. Ich hoffte auch, dass es einen schöneren Weg ohne einen HttpServletResponse-Parameter gibt. – Jan

+11

Ich finde das überhaupt nicht traurig –

+0

@MajidLaissi - eigentlich ist es ziemlich traurig. Zum größten Teil ist es möglich, Spring MVC Controller von jeglicher Abhängigkeit von HTTP als Transportprotokoll komplett zu abstrahieren, was hier leider nicht möglich ist. – Jules

-4

wenn Sie @RestController liefert ein String Sie so etwas wie dieses

return "redirect:/other/controller/"; 
verwenden können

und diese Art der Umleitung ist nur für GET Anfrage, wenn Sie andere Art der Anfrage Verwendung HttpServletResponse

+7

Es funktioniert nur für '@ Controller', aber nicht für den' @ RestController', der eine spezielle Version von '@ Controller' ist und fügt' @ ResponseBody' Annotation hinzu. Spring Framework konvertiert den Rückgabewert und schreibt ihn automatisch in die HTTP-Antwort. '@RestController public class RedirectController { @RequestMapping ("/ redirect") public String Redirect() { return "umleiten:/Sonstiges/Controller /"; } } 'und wenn wir versuchen werden, auf diese URL' curl localhost: 8080/redirect' zuzugreifen, sehen wir einfach 'redirect:/other/controller /' string als Ergebnis. –

+1

lesen Sie die ganze Antwort: D – skuarch

+2

Anton Balaniuc hat recht, und das Lesen Ihrer ganzen Antwort ist immer noch nicht richtig. In einem RestController gibt es nur den String "redirect:/other/controller" zurück, es wird nicht umgeleitet –

8

verwenden möchten keine direkte Abhängigkeit zu vermeiden, auf HttpServletRequest oder HttpServletResponse Ich schlage vor, eine „reine Spring“ Implementierung ein ResponseEntity wie diese Rückkehr:

HttpHeaders headers = new HttpHeaders(); 
headers.setLocation(URI.create(newUrl)); 
return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY); 

Wenn Ihr Methode gibt immer eine Umleitung zurück, verwenden Sie ResponseEntity<Void>, ansonsten wird alles, was normalerweise als generischer Typ zurückgegeben wird.

+1

Oder in einer Zeile 'return ResponseEntity.status (HttpStatus.MOVED_PERMANENTLY) .header (HttpHeaders.LOCATION, newUrl) .build() ; ' –