1

我有一个 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());

此代码完美运行,但以下列方式生成文档。

在此处输入图像描述

4

1 回答 1

3

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

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

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

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);

    }
}

您可以在文档中找到有关使用预处理器自定义请求和响应的更多信息。

于 2016-06-16T16:51:31.357 回答