【发布时间】:2013-10-01 07:39:42
【问题描述】:
假设我有一个 REST 样式的控制器映射
@RequestMapping(value="users", produces = {MediaType.APPLICATION_JSON_VALUE})
public List<User> listUsers(@ReqestParams Integer offset, @ReqestParams Integer limit, @ReqestParams String query) {
return service.loadUsers(query, offset, limit);
}
提供 JSON(甚至 XML)不是问题,使用 ContentNegotation 和 MessageConverters 很容易
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="true" />
<property name="favorParameter" value="false" />
<property name="ignoreAcceptHeader" value="false" />
<property name="mediaTypes" >
<value>
html=text/html
json=application/json
xml=application/xml
</value>
</property>
</bean>
现在,我需要添加对 PDF 的支持。自然,我想尽可能地使用(Spring)MVC + REST。我发现的大多数示例都使用不使用 REST 样式的显式定义来实现这一点,例如
@RequestMapping(value="users", produces = {"application/pdf"})
public ModelAndView listUsersAsPdf(@ReqestParams Integer offset, @ReqestParams Integer limit, @ReqestParams String query) {
List<User> users = listUsers(offset, limit, query); // delegated
return new ModelAndView("pdfView", users);
}
这可行,但不是很舒服,因为对于每个备用输出(PDF、Excel、...),我都会添加一个请求映射。
我已经在内容协商解析器中添加了application/pdf;不幸的是,任何带有后缀.pdf 或Accept-Header application/pdf 的请求都会以406 响应。
REST/MVC 样式模式集成 PDF 等替代输出的理想设置是什么?
【问题讨论】:
-
我可能会产生误解,但是您是否希望在任何时候对该 URL 的请求带有与 PDF 兼容的 Accept 标头时提供 PDF 文件?我认为您只想在某些 URL 上提供 PDF 文件,并且可能是与 JSON/REST API 不同的 URL。
-
嗯,基本上,这个想法确实是使用accept-header(实际上是扩展名)来请求pdf。为什么不?它将遵循内容协商模式,并且资源只会存在一次。
-
我认为将 application/pdf 添加到 ContentNegotiationManagerFactoryBean 是正确的第一步,但之后您需要添加一个能够生成 PDF 文件的 ViewResolver。你也这样做了吗?
标签: spring rest pdf spring-mvc model-view-controller