2015-03-16 8 views
40

У меня есть конечная точка REST, реализованная с помощью Spring MVC @RestController. Когда-то, зависит от входных параметров в моем контроллере. Мне нужно отправить http-перенаправление на клиент.Spring MVC @RestController и перенаправление

Возможно ли это с помощью Spring MVC @RestController, и если да, не могли бы вы показать пример?

+1

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

+2

Ваш связанный пост НЕ предназначен для '' '@ RestController''', потому что он включает' '' @ ResponseBody'''. Строка «перенаправление:» не будет интерпретироваться как представление. – Jan

ответ

66

Добавить HttpServletResponse параметр в свой метод обработки затем вызвать response.sendRedirect("some-url");

Что-то вроде:

@RestController 
public class FooController { 

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

} 
+0

К сожалению, это похоже на единственное решение. Я также надеялся, что есть лучший способ без параметра HttpServletResponse. – Jan

+11

Мне вообще этого не грустно –

+0

@MajidLaissi - на самом деле, это довольно печально. По большей части, можно полностью абстрагировать контроллеры Spring MVC от любой зависимости от HTTP как транспортного протокола вообще, но, к сожалению, здесь это невозможно. – Jules

-4

если вы @RestController возвращает Строка вы можете использовать что-то вроде этого

return "redirect:/other/controller/"; 

и этот вид перенаправления предназначен только для GET запрос, если вы хотите использовать другой тип использования запроса HttpServletResponse

+7

Он будет работать только для '@ Controller', но не для' @ RestController', который является специализированной версией '@ Controller' и добавляет аннотацию' @ ResponseBody'. Spring Framework преобразует возвращаемое значение и автоматически записывает его в ответ http. '@RestController public class RedirectController { @RequestMapping ("/redirect ") public String redirect() { return" redirect:/other/controller/"; } } 'и если мы попытаемся получить доступ к этому url' curl localhost: 8080/redirect', мы просто увидим 'redirect:/other/controller /' string в качестве результата. –

+1

прочитать весь ответ: D – skuarch

+2

Антон Баланюк прав, и читать весь ваш ответ по-прежнему не так. В RestController он просто вернет строку «redirect:/other/controller», она не будет перенаправлять –

8

Чтобы избежать прямой зависимости от HttpServletRequest или HttpServletResponse я предлагаю «чистой родниковой» осуществление возвращающая ResponseEntity так:

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

Если ваш метод всегда возвращает перенаправление, используйте ResponseEntity<Void>, в противном случае все возвращается обычно как общий тип.

+1

Или в одной строке 'return ResponseEntity.status (HttpStatus.MOVED_PERMANENTLY) .header (HttpHeaders.LOCATION, newUrl) .build() ; ' –

Смежные вопросы