我正在處理一個控制器,它向我的用戶提供數據拉取的CSV下載,並且我有一個基於奇妙有用的帖子的對象,控制器和HttpMessageConverter在這裏:https://stackoverflow.com/a/9961748/613559Spring MVC錯誤:org.springframework.web.HttpMediaTypeNotAcceptableException
我CsvResponse對象:
public class CsvResponse {
private final String filename;
private final List<Object[]> records;
private final List<String> columns;
public CsvResponse(List<Object[]> records, List<String> columns, String filename) {
this.records = records;
this.filename = filename;
this.columns = columns;
}
public String getFilename() {
return filename;
}
public List<Object[]> getRecords() {
return records;
}
public List<String> getColumns() {
return columns;
}
}
我的控制器:
@RequestMapping(value="/download", method = RequestMethod.POST, produces = "text/csv")
public @ResponseBody CsvResponse download (@RequestParam("jsonData") String jsonData) throws IOException {
// populate dataset and columns, removed for simplicity
return new CsvResponse(dataset, columns, "download_" + new SimpleDateFormat("yyyy.MM.dd_HH:mm:ss").format(new Date()) + ".csv");
}
我HttpMessageConverter:
public class CsvMessageConverter extends AbstractHttpMessageConverter<CsvResponse> {
public static final MediaType MEDIA_TYPE = new MediaType("text", "csv", Charset.forName("utf-8"));
public CsvMessageConverter() {
super(MEDIA_TYPE);
}
protected boolean supports(Class<?> clazz) {
return CsvResponse.class.equals(clazz);
}
protected void writeInternal(CsvResponse response, HttpOutputMessage output) throws IOException, HttpMessageNotWritableException {
OutputStream out;
CsvWriter writer;
List<Object[]> dataset;
output.getHeaders().setContentType(MEDIA_TYPE);
output.getHeaders().set("Content-Disposition", "attachment; filename=\"" + response.getFilename() + "\"");
out = output.getBody();
writer = new CsvWriter(new OutputStreamWriter(out), '\u0009');
dataset = response.getRecords();
for(Object[] datasetRow : dataset) {
for(Object cell : datasetRow) {
writer.write((cell instanceof String) ? "\"" + cell.toString() + "\"" : cell.toString());
}
writer.endRecord();
}
writer.flush();
writer.close();
}
@Override
protected CsvResponse readInternal(Class<? extends CsvResponse> type, HttpInputMessage him) throws IOException, HttpMessageNotReadableException {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
當我訪問下載控制器時,出現錯誤信息org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
。調試顯示CsvMessageConverter
未被訪問。如果我從控制器中刪除produces = "text/csv"
段,我得到CsvResponse對象的JSON字符串表示(對於@ResponseBody註釋是正確的),所以其餘代碼正常工作。我想我在這裏只是錯過了一些非常簡單的東西,但是整天把我的頭撞在牆上後,我仍然看不到它。我需要更改以使服務器使用CsvMessageConverter
?
謝謝,那正是缺少的! – asgallant