我已经提出了至少三种不同的方法来解决这个问题。
1)我可以使用@ResponseBody并返回一个字符串,就像我对这个csv一样:
@RequestMapping(value = "googleStoreReport", produces = "text/csv")
@ResponseBody
public String googleStoreReport(HttpServletRequest request, HttpServletResponse response, Model model) {
List<Store> stores = storeService.getActiveStores();
List<SapStore> sapStores = sapStoreService.getAllSapStores();
response.setHeader("Content-Disposition", "attachment; filename=\"Google_Places_Bulk_Store_Upload.csv\"");
response.setContentType("text/csv");
StringBuilder sb = new StringBuilder();
.... create file contents ....
return sb.toString();
}
2)我可以使用这里描述的视图:(我将不得不创建自己的Spring AbstractExcelView版本)http://www.technicalkeeda.com/spring-tutorials/generate-excel-using-spring-mvc这里的方法是让控制器返回一个带有List对象的ModelAndView对象包含行数据。然后你有一个View对象,它使用Poi将List转换为电子表格,并将电子表格作为流写入响应对象。
3)我可以使用MappingJackson2HttpMessageConverter作为模板扩展AbstractHttpMessageConverter。我返回列表而不是ModelAndView对象。 MessageConverter的工作方式与ViewResolver相同,但适用于Request Lifecycle的不同部分。 (将列表转换为电子表格数据流)
我主要建议:扩展AbstractView或AbstractHttpMessageConverter。我确实找到了三年前这篇不错的帖子http://java.dzone.com/articles/rest-spring,但作者遇到了同样的问题。为了让事情更加混乱,Spring MVC似乎使用了两种方法..
答案 0 :(得分:0)
您是否考虑过扩展您的第一个解决方案以包含一些其他基于xml的api,例如Jasper报告,以便您将数据与视图分离?
答案 1 :(得分:0)
刚刚和同事谈过这个问题并制定了一个指导我决定的规则。消息转换器似乎被设计为获取对象或对象集合并应用一组规则。这种格式化适用于Json,或者如果您有一个可以帮助转换器格式化XML的模式。另一方面,如果您输出的数据可能具有多个没有架构的严格格式,那么视图效果很好。您可以创建基本视图类来处理Excel Spread表。然后为每个单独的电子表格类型扩展基类。
这回答了我的具体问题。我相信我还没有充分探讨这个问题,并欢迎任何进一步的意见。
答案 2 :(得分:0)
根据经验,我会使用输出格式的消息转换器很简单,而在其他情况下使用视图。
如果控制器方法总是生成相同的输出格式(总是CSV),因为不需要模板来生成CSV文件,我会使用MessageConverter
相反,如果你想生成一个xlsx文件,我宁愿使用一个视图,因为一个视图可以使用一个模板。