我有一个用例,我需要将PDF返回给为我们生成的用户。看来我需要做的是在这种情况下使用ResponseEntity,但我有一些不太清楚的事情。
我正在使用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);
}
我真的不愿意接受回应......到目前为止,我的控制器都没有这样做过,而且我不想把它全部带进来。
答案 0 :(得分:22)
注意,这适用于Spring 3.1,不确定原始问题中提到的spring 3.0.5。
在返回的ResponseEntity语句中,您要处理重定向,只需在ResponseEntity中添加“Location”标头,将body设置为null并将HttpStatus设置为FOUND(302)。
HttpHeaders headers = new HttpHeaders();
headers.add("Location", "http://stackoverflow.com");
return new ResponseEntity<byte []>(null,headers,HttpStatus.FOUND);
这将使您不必更改控制器方法的返回类型。
答案 1 :(得分:3)
关于重定向,您需要做的就是将返回类型更改为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);
}
答案 2 :(得分:1)
重定向很容易 - 对于你的处理程序方法的返回字符串,只是前缀为redirect:
,就像return "redirect:somewhere else"
一样。
不确定为什么你反对Response
对象。有原因吗?否则,如果您只是在OutputStream
对象上将PDF作为HttpServletResponse
流式传输,那么您实际上不需要从处理程序方法返回PDF - 您只需要在PDF上设置PDF流响应,您可以将其添加到处理程序方法的签名中。有关示例,请参阅http://www.exampledepot.com/egs/javax.servlet/GetImage.html。
答案 3 :(得分:1)
我们决定只显示他们会收到的错误消息,而不是处理重定向(这些是我们在新窗口/标签中打开的实例)。
这可能不适用于所有人,但是通过我们添加错误/状态消息的方式,我们无法在发生异常时将这些消息保留在视图上。