2015-03-16 15 views
40

Tôi có một điểm cuối REST được triển khai với Spring MVC @RestController. Đôi khi, phụ thuộc vào thông số đầu vào trong bộ điều khiển của tôi, tôi cần phải gửi chuyển hướng http trên máy khách.Spring MVC @RestController và chuyển hướng

Có thể với Spring MVC @RestController và nếu có, bạn có thể vui lòng hiển thị ví dụ không?

+1

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

+2

Bài đăng được liên kết của bạn KHÔNG dành cho các lớp '' '@ RestController''' vì nó bao gồm' '' @ ResponseBody'''. Chuỗi "chuyển hướng:" của bạn sẽ không được hiểu là chế độ xem. – Jan

Trả lời

66

Thêm một tham số HttpServletResponse để Method Handler của bạn sau đó gọi response.sendRedirect("some-url");

Cái gì như:

@RestController 
public class FooController { 

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

} 
+0

Đáng buồn thay, điều này trông giống như giải pháp duy nhất. Tôi cũng hy vọng có một cách đẹp hơn mà không có tham số HttpServletResponse. – Jan

+11

Tôi không thấy điều này buồn ở tất cả –

+0

@MajidLaissi - thực sự, nó khá buồn. Đối với hầu hết các phần, có thể hoàn toàn trừu tượng bộ điều khiển MVC Spring đi từ bất kỳ phụ thuộc vào HTTP như là một giao thức vận tải ở tất cả, nhưng đó là tiếc là không thể ở đây. – Jules

-4

nếu bạn @RestController trả về một Chuỗi bạn có thể sử dụng một cái gì đó như thế này

return "redirect:/other/controller/"; 

và loại chuyển hướng này chỉ dành cho GET yêu cầu, nếu bạn muốn sử dụng loại khác đề nghị sử dụng HttpServletResponse

+7

Nó sẽ chỉ hoạt động với '@ Controller' nhưng không hoạt động cho' @ RestController' là phiên bản chuyên biệt của '@ Controller' và thêm chú thích' @ ResponseBody'. Spring Framework sẽ chuyển đổi giá trị trả lại và tự động ghi nó vào câu trả lời http. '@RestController lớp công khai RedirectController { @RequestMapping ("/redirect ") chuyển hướng chuỗi công khai() { trả về" chuyển hướng:/other/controller/"; } } 'và nếu chúng ta cố gắng truy cập url đó' curl localhost: 8080/redirect', chúng ta sẽ thấy kết quả là 'redirect:/other/controller /' string. –

+1

đọc toàn bộ câu trả lời: D – skuarch

+2

Anton Balaniuc là đúng, và đọc toàn bộ câu trả lời của bạn vẫn không đúng. Trong một RestController nó sẽ chỉ trả về String "redirect:/other/controller", nó sẽ không chuyển hướng –

8

Để tránh bất kỳ sự phụ thuộc trực tiếp vào HttpServletRequest hoặc HttpServletResponse Tôi đề nghị một "mùa xuân tinh khiết" thực hiện trả lại một ResponseEntity như thế này:

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

Nếu bạn phương pháp luôn trả về một chuyển hướng, sử dụng ResponseEntity<Void>, nếu không bất kỳ điều gì được trả lại bình thường như là loại chung.

+1

Hoặc trong một dòng 'return ResponseEntity.status (HttpStatus.MOVED_PERMANENTLY) .header (HttpHeaders.LOCATION, newUrl) .build() ; ' –

Các vấn đề liên quan