1

所以我试图向我的后端发送一个文件和一个对象。然后我使用 Multipartfile 创建一个 Apache Poi 工作簿。使用 apache 的迭代器,我遍历文件,提取并保存我需要的内容。效果很好(它甚至将新数据保存在数据库中),但是到达 Return 语句时的函数没有返回

它似乎没有终止,因为它没有返回 StatusCode 或对象(尝试了不同的选项,见下文)。我的其他 controlerfunctions 做得很好,所以我确保我的代码正在到达 return 语句。我从代码中取出行,直到问题不再发生。创建工作簿时似乎会发生这种情况。我尝试关闭工作簿。我什至尝试手动关闭 Inputstream,但错误仍然存​​在。我尝试更改返回值(返回 Responseentity、返回 DTO、具有 void 函数并设置 @HTTPResponseStatus),但这并没有改变行为。当我拿出工作簿时,所有三种方法都奏效了。我尝试了不同版本的 apache poi(5.0.0、4.0.0、3.15)。但仍然没有返回值。

这是我的控制器:

@RestController
@RequestMapping("/trafficdata")
public class TrafficDataController {

@Autowired
TrafficDataRepository trafficDataRepository;

@PostMapping(value = "/filedata", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity addDataFromFile(@RequestParam("model") String model, @RequestParam(value = "file", required = false) MultipartFile file) throws PermissionDeniedException, FileNotImportableException, DataKeyAlreadyTakenException, JsonProcessingException {
    UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    if(!userDetails.isProfessor()){
        throw new PermissionDeniedException();
    }

    ObjectMapper mapper = new ObjectMapper();
    FileTrafficDataInputDTO trafficDataInputDTO = mapper.readValue(model, FileTrafficDataInputDTO.class);

    if(trafficDataRepository.existsByDataKey(trafficDataInputDTO.getDataKey())){
        throw new DataKeyAlreadyTakenException(trafficDataInputDTO.getDataKey());
    }

    Workbook workbook;
    DataFormatter dataFormatter = new DataFormatter();
    String lowerCaseFileName = file.getOriginalFilename().toLowerCase();
    InputStream inputStream;
    try {
        inputStream = file.getInputStream();
        workbook = WorkbookFactory.create(inputStream); //as soon as I take out this, it works
    } catch (IOException e) {
        e.printStackTrace();
        throw new FileNotImportableException(file.getOriginalFilename());
    }

    try {
        //I tried something here inputStream.close();
        workbook.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    /* working with the data */
    return new ResponseEntity(HttpStatus.CREATED);
}}

这些是我的 Maven 依赖项:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-ldap</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <version>2.0.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.apache.directory.api</groupId>
        <artifactId>api-all</artifactId>
        <version>2.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.0.0</version>
    </dependency>
</dependencies>

有谁知道如何解决这个问题和/或为什么会出现这个问题?

4

0 回答 0