我正在一个项目中,我需要使用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时,出现上述错误。
如果您需要更多详细信息,请告诉我。
答案 0 :(得分:0)
要在使用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;
}
答案 1 :(得分:0)
我通过在本地存储文件解决了该问题。 在调用第三方API时,我给出了此文件的位置,并且该文件可以正常工作。
在控制器方法中:
@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, "");
}
已调用服务
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;
}