如何封送springframework.web.multipart.MultipartFile

时间:2019-05-29 22:17:00

标签: rest file spring-boot marshalling

我正在尝试编组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);

我对此表示感谢

1 个答案:

答案 0 :(得分:0)

经过一些研究,发现了一些错误之后,下面的代码解决了我遇到的问题。

服务:

    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中使用字节数组代替了multipartfile,这为我解决了这个问题。