【问题标题】:Calling external api from spring boot with multipart/form-data使用 multipart/form-data 从 Spring Boot 调用外部 api
【发布时间】:2019-06-19 18:19:00
【问题描述】:

我正在一个项目中工作,我需要使用 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 时,我得到上面提到的错误。

如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 您能否对此进行扩展并添加调用此方法并创建 MultipartFile 对象的方法?
  • @Kieveli 我没有创建,我正在使用邮递员表单数据上传文件并进入控制器。

标签: java spring spring-boot multipartform-data


【解决方案1】:

我通过在本地存储文件解决了这个问题。 在调用第三方 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;
    }
    

【讨论】:

    【解决方案2】:

    要在使用 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;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多