0

私はユーザーにデータ プルの CSV ダウンロードを提供するコントローラーに取り組んでいます。オブジェクト、コントローラー、および HttpMessageConverter は、こちらの非常に役立つ投稿に基づいています: https://stackoverflow.com/a/9961748/ 613559

私の 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か?

4

1 に答える 1

1

このブロックを spring-mvc.xml に追加して、csv コンバーターを登録する必要があります。

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

私は例を書きましたが、うまくいきます。

于 2013-08-31T03:18:14.853 に答える