Spring Cloud Gateway не возвращает правильный код ответа, предоставленный службой Downstream (для загрузки файла) - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть простой нисходящий сервис для загрузки файлов. Пример кода

@RestController
@RequestMapping("/file")
public class FileController {

    @PostMapping("/upload")
    public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file,
        @RequestParam(value = "delay", required = false, defaultValue = "0") int delay) throws Exception {

        System.out.println(String.join(System.getProperty("line.separator"),
            "File Name => " + file.getOriginalFilename(),
            "File Size => " + file.getSize() + "bytes",
            "File Content Type => " + file.getContentType()));

        TimeUnit.MILLISECONDS.sleep(delay);

        return ResponseEntity.ok(file.getName() + " uploaded");
    }

}

и CustomExceptionHandler, который возвращает BAD_REQUEST, если есть MultipartException:

@Configuration
@ControllerAdvice
public class CustomExceptionHandler {
    @ExceptionHandler(MultipartException.class)
    public ResponseEntity<String> handleMultipartException(MultipartException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
}

Предел размера составляет 10 МБ в application.yml:

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

Если я загружаю большой файл, он дает мне статус 400, как и ожидалось File serivce responsing 400

Когда я пытаюсь нажать то же самое с помощью Spring Cloud Gateway Я получаю следующий результат:

enter image description here

и в журналах показывается следующее:

2019-11-08 00:36:10.797 ERROR 21904 --- [ctor-http-nio-2] a.w.r.e.AbstractErrorWebExceptionHandler : [86e57f7e] 500 Server Error for HTTP POST "/product-service/file/upload"

reactor.netty.http.client.PrematureCloseException: Connection has been closed BEFORE response, while sending request body

Обратите внимание , что шлюз настроен на получение файла большого размера с глобально установленным фильтром RequestSize, чтобы он занимал более 10 МБ.

Как я могу получить тот же код ответа, который заданнисходящий сервис?

Кроме того, я проверяю с традиционным Zuul, и я также получаю ошибку 500.

Пример кода spring-cloud-gateway / product-service / eureka- https://github.com/dhananjay12/spring-cloud/tree/master/spring-routing

...