Что такое правильное свойство сервера в приложении spring boot.properties?

#spring

Вопрос:

стек: Java 14, Весенняя загрузка 2.5.3, MySQL 8.0.26

У меня есть весенняя загрузка, загружающая веб-приложение Excel. Файл Excel объемом 14 КБ был успешно загружен. Однако при попытке загрузить файл Excel объемом от 15 до 50 МБ возникает следующее исключение.

Я предполагаю, что время подключения к серверу истекло при загрузке. Я предполагаю, что сервер должен быть закрыт до загрузки файла из-за короткого времени подключения к серверу. Чтобы решить эту проблему, я попытался изменить настройки сервера в application.properties . Я нашел кое-какую собственность. Но это было неприлично. IDE подчеркивает это следующим образом. Я также посетил страницу Свойств общего приложения Spring, чтобы найти подходящее свойство, но не смог его найти.

Я хотел бы знать, что вызывает исключение. И я задаюсь вопросом, является ли это правильным способом решения проблемы.

Заранее спасибо. Если вы ответите, я отвечу как можно скорее.

консоль исключений

 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.impl.IOFileUploadException: Processing of multipart/form-data request failed. java.io.EOFException] with root cause

java.io.EOFException: null
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1294) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1206) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:805) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:42) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1172) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:101) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:249) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.coyote.Request.doRead(Request.java:640) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:317) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:600) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:340) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at java.base/java.io.FilterInputStream.read(FilterInputStream.java:132) ~[na:na]
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:132) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:975) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:879) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at java.base/java.io.FilterInputStream.read(FilterInputStream.java:132) ~[na:na]
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:132) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at java.base/java.io.FilterInputStream.read(FilterInputStream.java:106) ~[na:na]
    at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:291) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.catalina.connector.Request.parseParts(Request.java:2922) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.catalina.connector.Request.getParts(Request.java:2824) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1098) ~[tomcat-embed-core-9.0.52.jar:9.0.52]
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:95) ~[spring-web-5.3.9.jar:5.3.9]
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:88) ~[spring-web-5.3.9.jar:5.3.9]
    at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:122) ~[spring-web-5.3.9.jar:5.3.9]
    at ...
 

применение.свойства

server.tomcat.connection-timeout это правильно. Но server.tomcat.disable-upload-timeout и server.connectionUploadTimeout не являются надлежащими.

 server.tomcat.connection-timeout=5000
server.tomcat.disable-upload-timeout=false
server.connectionUploadTimeout=5000

spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB
 

Обслуживание

 package com.nc.ojtfirstproject.service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.nc.ojtfirstproject.domain.standardProduct.StandardProduct;
import com.nc.ojtfirstproject.domain.standardProduct.StandardProductRepository;

@Service
public class StandardProductService {

    private final StandardProductRepository standardProductRepository;

    public StandardProductService(StandardProductRepository standardProductRepository) {
        this.standardProductRepository = standardProductRepository;
    }

    @Transactional
    public void save(MultipartFile file) {

        final int TRANSACTION_CHUNK_LIMIT = 10000;
        List<StandardProduct> standardProductList = new ArrayList<StandardProduct>();

        try {
            Workbook workbook = new XSSFWorkbook(file.getInputStream());

            Sheet sheet = workbook.getSheetAt(0);
            
            for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i  ) {
                Row row = sheet.getRow(i);
                StandardProduct standardProduct = new StandardProduct();
                
                standardProduct.setCode((int) row.getCell(0).getNumericCellValue());
                standardProduct.setCategoryCode((int) row.getCell(1).getNumericCellValue());
                standardProduct.setName(row.getCell(2).getStringCellValue());
                standardProduct.setLowestPrice((int) row.getCell(3).getNumericCellValue());
                standardProduct.setMobileLowestPrice((int) row.getCell(4).getNumericCellValue());
                standardProduct.setAveragePrice((int) row.getCell(5).getNumericCellValue());
                standardProduct.setCompanies((int) row.getCell(6).getNumericCellValue());
                standardProductList.add(standardProduct);
                
                // TRANSACTION_CHUNK_LIMIT saveAll()
                if (TRANSACTION_CHUNK_LIMIT == standardProductList.size()) {
                    standardProductRepository.saveAll(standardProductList);
                    standardProductList.clear();
                    System.out.println(TRANSACTION_CHUNK_LIMIT   " success");
                }
            }
            
            workbook.close();
            
        } catch (IOException e) {
            throw new RuntimeException("save fail: "   e.getMessage());
        }

        // TRANSACTION_CHUNK_LIMIT saveAll()
        try {
            standardProductRepository.saveAll(standardProductList);
        } catch (Exception e) {
            throw new RuntimeException("save fail: "   e.getMessage());
        }
    }
}

 

controller

 package com.nc.ojtfirstproject.web;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.nc.ojtfirstproject.message.ResponseMessage;
import com.nc.ojtfirstproject.service.StandardProductService;

@Controller
public class StandardProductController {
    
    private final StandardProductService standardProductService;

    public StandardProductController(StandardProductService standardProductService) {
        this.standardProductService = standardProductService;
    }

    @PostMapping("/excel/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) {

        String TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        HttpStatus status = HttpStatus.OK;
        String message = "";
        if (TYPE.equals(file.getContentType())) {
            try {
                standardProductService.save(file);

                status = HttpStatus.OK;
                message = "success: "   file.getOriginalFilename();
            } catch (Exception e) {
                status = HttpStatus.EXPECTATION_FAILED;
                message = "fail: "   file.getOriginalFilename();
            }
        } else {
            status = HttpStatus.BAD_REQUEST;
            message = "Please upload excel file";
        }
        return ResponseEntity.status(status).body(new ResponseMessage(message));
    }
}

 

сборка.сортировка

 plugins {
    id 'org.springframework.boot' version '2.5.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.nc'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '14'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'io.springfox:springfox-boot-starter:3.0.0'
    implementation 'org.apache.poi:poi:4.1.2'
    implementation 'org.apache.poi:poi-ooxml:4.1.2'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}


 

Комментарии:

1. Нет никакого свойства, чтобы установить/отключить его. Отсюда и тот факт, что это не сработает.

2. Я использую исключительно те же файлы реквизитов, и это работает. Вы можете попробовать -1 неограниченный размер, чтобы увидеть, изменится ли это что-то.

3. К. М. Дейну Спасибо за комментарий. Не могли бы вы, пожалуйста, сообщить мне, в каком отеле это было организовано?

4. Для. Антониосссс Спасибо вам за внимание. Не могли бы вы сказать мне, что такое неограниченный размер ?

5. disable-upload-timeout Для tomcat нет свойства для установки параметра. Вам понадобится настройщик, чтобы установить его. И я не думаю, что это решит вашу реальную проблему.