Вызов внешнего API из весенней загрузки с multipart / form-data - PullRequest
1 голос
/ 19 июня 2019

Я работаю в проекте, где мне нужно получить данные из изображения с помощью ocr. Я использую ocr третьими лицами, где я могу загрузить файл и получить данные из ocr.

Мне нужно вызывать этот 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, я получаю ошибку, упомянутую выше.

Дайте мне знать, если вам нужно больше деталей.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Я решил проблему, сохранив файл локально. При вызове стороннего 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;
    }
    
0 голосов
/ 20 июня 2019

Чтобы отключить сбой на пустых бинах, так как вы используете springboot, вы можете установить следующее свойство:

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;
}
...