2013-08-30 124 views
0

我正在處理一個控制器,它向我的用戶提供數據拉取的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

回答

1

則應該通過添加該塊彈簧mvc.xml

<mvc:annotation-driven> 
    <mvc:message-converters register-defaults="true"> 
     <bean class="com.xxx.utils.CsvMessageConverter"></bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

我寫了一個例子,它的工作原理註冊您的CSV格式轉換器。

+0

謝謝,那正是缺少的! – asgallant