首页 > 解决方案 > LinkedMultiValueMap 与覆盖的方法

问题描述

所以我有一些代码,其中正在进行 API 调用,以字节为单位发送 pdf 文件,并使用 LinkedMultiValueMap 返回响应。我是 LinkedMultiValueMap 的新手,这段代码根本不是我写的,所以我很难理解这一切。

API 调用

IntegrationResult<UploadResDto> UploadRes = uploadService.postUpload(File);

文件是 ByteArrayInputStream 类型,它是使用函数生成的 pdf 文件夹。UploadResDto 基本上只是响应的结构

 public Header headers;
 public Body body;
 public String statusCode;
 public int statusCodeValue;

上传文件的服务

public IntegrationResult<UploadResDto> postUpload(ByteArrayInputStream inputStream) {
    ConsentUploadResDto response;
    try {
        response = getResponseObjectDto(inputStream, UploadResDto.class);
    } catch (Exception e) {
        log.error(e);
        return new IntegrationResult<>(null, EXCEPTION);
    }
    return new IntegrationResult<>(response);
}
private <T> T getResponseObjectDto(ByteArrayInputStream inputStream, Class<T> clazz) throws JsonProcessingException {
    String responseBody = FileUploadClient.exchange(inputStream);
    if (StringUtils.isBlank(responseBody)) {
        return null;
    }
    return new ObjectMapper().readValue(responseBody, clazz);
}

客户服务

public String exchange(ByteArrayInputStream inputStream) {
        RestTemplate restTemplate = getRestTemplate();

        Optional<ResponseEntity<String>> responseEntity;
        try {
            LinkedMultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
            body.add("file", new InputStreamResource(inputStream) {
                @Override
                public String getFilename(){
                    return filename;
                }
            });

            HttpEntity<MultiValueMap<String, Object>> requestEntity
                    = new HttpEntity<>(body, getHeaders());

            responseEntity = Optional.of(
                    restTemplate
                            .postForEntity(getUri(url), requestEntity, String.class));

            log.infof("%s", responseEntity.map(ResponseEntity::getBody).orElse(null));

        } catch (Exception e) {
            log.debug(e.getMessage());
            return null;
        }

        if (HttpStatus.OK.equals(responseEntity.map(ResponseEntity::getStatusCode).orElse(null))) {
            return responseEntity.map(ResponseEntity::getBody)
                    .orElseThrow(() -> new ApiClientException("ResponseEntity body not found."));
        }

        throw new FileUploadApiClientException("Unexpected httpStatus.");
    }

    private URI getUri(String httpUrl) {
        return UriComponentsBuilder.fromHttpUrl(httpUrl).build().toUri();
    }

    private HttpHeaders getHeaders() {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MULTIPART_FORM_DATA);
        return httpHeaders;
    }

    private RestTemplate getRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        SimpleClientHttpRequestFactory simpleClient = new SimpleClientHttpRequestFactory();
        simpleClient.setConnectTimeout(connectTimeout);
        simpleClient.setReadTimeout(readTimeout);

        ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(simpleClient);
        restTemplate.setRequestFactory(factory);

        return restTemplate;
    }
}

这部分是开始让我有点不知所措的地方。为什么我们需要将 responseBody 作为字符串返回。字符串以空白形式返回给我,所以我得到空值?交换功能究竟是做什么的?此外,我找不到任何覆盖其中方法的 LinkedMultiValue 示例,因此我无法理解覆盖其中的方法的真正作用以及它为什么需要发生。

任何关于解释代码的帮助或关于如何优化它以获得我想要达到的目标的建议都非常感谢。

标签: javaspring-bootspring-mvc

解决方案


推荐阅读