Я пытаюсь маршалировать Multipartfile, но получаю следующее
com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.io.FileInputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileInputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileInputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileInputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileInputStream["fd"]->java.io.FileDescriptor["parent"]->java.io.FileInputStream["fd"]->java.io
Я пытался найти в Google способы синхронизации Multipartfile или преобразования Multipartfile в CommonsMultipartFile, но всегда сталкивался с проблемами, я использую SpringBoot 2.1.2. Ниже мой код
Контроллер:
@PostMapping(path = "/upload")
public ResponseEntity<Void> save(@RequestPart("document") CommonsMultipartFile multipartfile, @RequestPart("userDTO") UserDTO userDTO) {
fileService.save(multipartfile, userDTO);
return new ResponseEntity<>(HttpStatus.CREATED);
}
Оказание услуг:
public void jacksonDataFormat(UserDTO userDTO) {
try {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
objectMapper.writeValueAsString(userDTO);
} catch (Exception e) {
System.out.println(e);
}
}
public void save(MultipartFile multipartfile, UserDTO userDTO) {
userDTO.setDocument(multipartfile);
jacksonDataFormat(userDTO);
publisher.publishEvent(new CreateEvent(saveDocumentDTO));
}
Ниже приведен код, вызывающий исключение JsonMappingException:
objectMapper.writeValueAsString(userDTO);
Я ценю любую помощь в этом
После некоторых исследований и нескольких следов и ошибок код ниже устранил проблему, с которой я сталкивался.
Оказание услуг:
public void jacksonDataFormat(UserDTO userDTO) {
try {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
objectMapper.writeValueAsString(userDTO);
} catch (Exception e) {
System.out.println(e);
}
}
public void save(MultipartFile multipartfile, UserDTO userDTO) {
userDTO.setDocumentContent(multipartfile.getBytes());
jacksonDataFormat(userDTO);
publisher.publishEvent(new CreateEvent(saveDocumentDTO));
}
Я использовал массив байтов вместо составного файла в UserDTO, и это решило проблему для меня.