Spring ResponseEntity - PullRequest
       2

Spring ResponseEntity

13 голосов
/ 21 июля 2011

У меня есть случай, когда мне нужно вернуть PDF пользователю, который создан для нас. Кажется, что в этом случае мне нужно использовать ResponseEntity, но у меня есть пара вещей, которые не очень понятны.

  1. Как я могу перенаправить пользователя - давайте представим, что у него нет прав доступа к этой странице? Как я могу перенаправить их на отдельный контроллер?
  2. Могу ли я установить кодировку ответа?
  3. Могу ли я достичь любого из этих двух параметров, не добавляя HttpResponse в качестве параметра для моего RequestMapping?

Я использую Spring 3.0.5. Пример кода ниже:

@Controller
@RequestMapping("/generate/data/pdf.xhtml")
public class PdfController {

    @RequestMapping
    public ResponseEntity<byte []> generatePdf(@RequestAttribute("key") Key itemKey) {
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.valueOf("application/pdf"));

        if (itemKey == null || !allowedToViewPdf(itemKey)) {
            //How can I redirect here?
        }

        //How can I set the response content type to UTF_8 -- I need this
        //for a separate controller
        return new ResponseEntity<byte []>(PdfGenerator.generateFromKey(itemKey),
                                           responseHeaders,
                                           HttpStatus.CREATED);
    }

Я бы действительно не хотел выдвигать Ответ ... Ни один из моих контролеров не сделал этого до сих пор, и я не хотел бы, чтобы его вообще вводили.

Ответы [ 4 ]

22 голосов
/ 07 марта 2013

Обратите внимание, что это работает весной 3.1, не уверен насчет весны 3.0.5, как было задано в оригинальном вопросе.

В вашем ответном операторе ResponseEntity, в котором вы хотите обработать перенаправление, просто добавьте заголовок «Location» к ResponseEntity, установите для тела значение null и установите для HttpStatus значение FOUND (302).

HttpHeaders headers = new HttpHeaders();
headers.add("Location", "http://stackoverflow.com");

return new ResponseEntity<byte []>(null,headers,HttpStatus.FOUND);

Это избавит вас от необходимости изменять тип возврата метода контроллера.

3 голосов
/ 27 ноября 2014

Что касается перенаправления, все, что вам нужно сделать, это изменить тип возвращаемого значения на Object:

@Controller
@RequestMapping("/generate/data/pdf.xhtml")
public class PdfController {

    @RequestMapping
    public Object generatePdf(@RequestAttribute("key") Key itemKey) {
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.valueOf("application/pdf"));

        if (itemKey == null || !allowedToViewPdf(itemKey)) {
            return "redirect:/some/path/to/redirect"
        }

        //How can I set the response content type to UTF_8 -- I need this
        //for a separate controller
        return new ResponseEntity<byte []>(PdfGenerator.generateFromKey(itemKey),
                                           responseHeaders,
                                           HttpStatus.CREATED);
    }
1 голос
/ 03 августа 2011

Вместо того, чтобы заниматься перенаправлением (это экземпляры, которые мы открываем в новых окнах / вкладках), в любом случае мы решили просто отобразить сообщение об ошибке, которое они получили бы.

Это, вероятно, не будет работать для всех,но из-за способа добавления сообщений об ошибках / состоянии мы не смогли сохранить эти сообщения в представлении при возникновении исключения.

1 голос
/ 22 июля 2011

Перенаправления просты - для возвращаемого String метода вашего обработчика просто добавьте redirect:, как в return "redirect:somewhere else".

Не знаете, почему вы возражаете против объекта Response.Есть ли причина?В противном случае, если вы просто передаете PDF как OutputStream на объекте HttpServletResponse, тогда вам на самом деле не нужно возвращать PDF из вашего метода-обработчика - вам просто нужно установить поток PDF в ответе, который выможете добавить к подписи вашего метода обработчика.См. http://www.exampledepot.com/egs/javax.servlet/GetImage.html для примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...