반응형
에러
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: 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"])] with root cause
원인
MSA 구조의 서비스에 이미지 서버로 이미지를 업로드 하는 과정에서 MultipartFile 객체를 바디값으로 전송하면서 발생한 문제
타겟 서버
@PostMapping("/upload")
public ResponseEntity<ImageDTO> uploadImage(
@RequestPart List<MultipartFile> images
) throws IOException {
logger.info("[upload image]");
return this.imageService.uploadImage(images);
}
서버는 multipart/form-data의 body값으로 MultipartFile을 받고 있다.
해결
ByteArrayResource body = new ByteArrayResource(image.getBytes()) {
@Override
public String getFilename() {
return image.getOriginalFilename();
}
};
MultipartFile 이미지 객체를 ByteArrayResource 객체로 만들어주고 RestTemplate로 전송하니 해결되었다.
RestTemplate
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
HttpEntity<?> http = new HttpEntity<>(headers);
MultiValueMap<String, Object> bodyMap = new LinkedMultiValueMap<>();
bodyMap.add("images", body);
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
http = new HttpEntity<>(bodyMap, headers);
ResponseEntity response = restTemplate.exchange(uri, HttpMethod.POST, http, LinkedHashMap.class);
반응형
'웹' 카테고리의 다른 글
[Spring Boot] Mockito를 사용한 단위 테스트 종속성 제거 (0) | 2024.01.09 |
---|---|
Spring Cloud Gateway JWT 인증, 인가 Filter 구현 및 적용 (0) | 2023.11.13 |
Spring Cloud Eureka란? (0) | 2023.10.30 |
Spring Boot에서 보안을 위한 JWT를 발급하는 방법 (0) | 2023.10.27 |
JWT란? (0) | 2023.10.26 |