簡體   English   中英

從Spring Boot使用multipart / form-data調用外部api

[英]Calling external api from spring boot with multipart/form-data

我在一個項目中工作,我需要使用ocr從圖像中獲取數據。 我正在第三方使用ocr,可以在其中上傳文件並從ocr中獲取數據。

我需要通過Spring Boot調用此API。 這個api是multipart / form-data。

我創建了一個接受文件的函數,並嘗試創建一個請求以將該文件發布到外部api。 我遇到錯誤

"message": "Type definition error: [simple type, class java.io.FileDescriptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: 

org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile[\"inputStream\"]->java.io.FileInputStream[\"fd\"])",

控制器方式

@PostMapping(value = "/ocrImage")
    public  ResponseEntity<GenericResponse> ocrImage(@RequestParam("file") MultipartFile file) {

        Object ocrDataImage = ocrService.ocrImage(file);
        return ResponseBuilder.buildResponse(ocrDataImage , 0, "");
    }

服務稱為

public Object ocrImage(MultipartFile file) {

    // adding headers to the api
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    headers.set("x-key", API_KEY);

    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    body.add("file", file);


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

    RestTemplate restTemplate = new RestTemplate();
    Object result = restTemplate.postForEntity(EXTERNAL_API_ENDPOINT, requestEntity,
            String.class);

    System.out.println(result);
    return result;

}

調用postForEntity時,出現上述錯誤。

讓我知道您是否需要更多詳細信息。

要使用springboot禁用空bean失敗,可以設置以下屬性:

application.properties

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

或者您可以在對象映射器中手動設置它,例如:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    MappingJackson2HttpMessageConverter converter = 
        new MappingJackson2HttpMessageConverter(mapper);
    return converter;
}

我通過在本地存儲文件解決了該問題。 在調用第三方API時,我給出了該文件的位置,並且該文件有效。

  1. 在控制器方法中:

     @PostMapping(value = "/ocrImage") public ResponseEntity<GenericResponse> ocrImage(@RequestParam("file") MultipartFile file) { // I have created a function to store file locally and return the absolute path String fileName = fileStorageService.storeFile(file); // passing the filepath to the service method Object ocrDataImage = ocrService.ocrImage(fileName); return ResponseBuilder.buildResponse(ocrDataImage , 0, ""); } 
  2. 服務稱為

     public String ocrImage(String path) { // getting the file from disk FileSystemResource value = new FileSystemResource(new File(path)); // adding headers to the api HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); headers.set("x-key", API_KEY); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(); body.add("file", value); HttpEntity<MultiValueMap<String, Object>> requestEntity= new HttpEntity<>(body, headers); RestTemplate restTemplate = new RestTemplate(); String result = restTemplate.postForEntity(EXTERNAL_API_ENDPOINT, requestEntity, String.class).getBody().toString(); System.out.println(result); return result; } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM