Как выполнить маршал springframework.web.multipart.MultipartFile - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь маршалировать 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

Я пытался найти способы синхронизации 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);

Я благодарен за любую помощь в этом

1 Ответ

0 голосов
/ 16 июля 2019

После некоторого исследования и нескольких ошибок и следов, код ниже исправил проблему, которую я получил.

Услуги:

    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));
    }

Я использовал байтовый массив вместо multipartfile в UserDTO, и это решило проблему для меня.

...