使用 multipart/form-data 从 spring 启动调用外部 api
Calling external api from spring boot with multipart/form-data
我在一个项目中工作,我需要使用 ocr 从图像中获取数据。
我正在使用第三方的 ocr,我可以上传文件并从 ocr 中获取数据。
我需要通过 spring 引导调用此 API。这个 api 是 multipart/form-data.
我创建了一个获取文件的函数,并尝试创建一个请求 post 将文件发送到外部 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 时,我给出了这个文件的位置并且它起作用了。
在控制器方法中:
@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;
}
我在一个项目中工作,我需要使用 ocr 从图像中获取数据。 我正在使用第三方的 ocr,我可以上传文件并从 ocr 中获取数据。
我需要通过 spring 引导调用此 API。这个 api 是 multipart/form-data.
我创建了一个获取文件的函数,并尝试创建一个请求 post 将文件发送到外部 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 时,我给出了这个文件的位置并且它起作用了。
在控制器方法中:
@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; }