使用Spring-doc Excel上载API文档

时间:2016-06-16 13:20:50

标签: excel spring asciidoc spring-restdocs

我有一个Spring REST API,它将Excel文件上传到服务器。我需要用spring和AsciiDoc编写API文档。我尝试按照以下方式编写文档,但在文档HTML中,它显示了来自excel的编码字符。

        final URL resource = MYClass.class.getResource("/excel/excel.xls");
        final File file = new File(resource.toURI());
        final FileInputStream fileInputStream = new FileInputStream(file);
        final MockMultipartFile fstmp = new MockMultipartFile("file", file.getName(), "multipart/form-data", fileInputStream);

        UriComponentsBuilder url= uri.path("/api/v1/uploadExcel")
            .queryParam("file", fstmp);

        document.snippets(
            requestParameters(
                parameterWithName("file").description("Excel file to upload")
            )
        );
    mockMvc.perform(MockMvcRequestBuilders.fileUpload(url.toUriString()).file(fstmp)).andExpect(status().isOk());

此规范运作良好,但以下列方式生成文档。

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以做几件不同的事情:

一种选择是将一些虚拟数据发送到控制器以进行记录。您可以发送字符串<<binary XLS data>>或类似字符,而不是发送实际的XLS文件。这种方法要求您能够模拟控制器用于处理XLS数据的任何内容,以便它可以处理接收实际上不是XLS文件的数据。

另一种选择是使用OperationPreprocessor。这允许您发送&#34;正确的&#34;请求您的控制器,然后在记录之前对其进行修改。您可以编写一个修改分段上传内容的预处理器:

final class PartContentModifyingPreprocessor extends OperationPreprocessorAdapter {

    private final OperationRequestPartFactory partFactory = new OperationRequestPartFactory();

    private final OperationRequestFactory requestFactory = new OperationRequestFactory();

    @Override
    public OperationRequest preprocess(OperationRequest request) {
        List<OperationRequestPart> parts = new ArrayList<>();
        for (OperationRequestPart part : request.getParts()) {
            parts.add(this.partFactory.create(part.getName(),
                    part.getSubmittedFileName(), "<<binary data>>".getBytes(),
                    part.getHeaders()));
        }
        return this.requestFactory.create(request.getUri(), request.getMethod(),
                request.getContent(), request.getHeaders(), request.getParameters(),
                parts);

    }
}

您可以在the documentation中找到有关使用预处理器自定义请求和响应的详细信息。