ResponseEntity, возвращаемый @@ ExceptionHandler в @ControllerAdvice, не может быть показан в swagger-ui.html - PullRequest
0 голосов
/ 17 января 2019

Ответ, возвращаемый @ExceptionHandler для MaxUploadSizeExceededException в @ControllerAdvice, не может быть показан в swagger-ui.html.

Я использую Spring Boot для моего приложения RESTful. И использование Swagger-UI для использования API RESTful. Один из моих RESTful API - это загрузка файла с использованием Spring. MultipartFile.

Размер файла ограничен, и когда размер загружаемого файла превышает ограничение, возникает исключение, как показано ниже. [Ошибка обработки запроса; вложенное исключение: org.springframework.web.multipart.MaxUploadSizeExceededException: превышен максимальный размер загрузки ...

Чтобы обработать это исключение и вернуть настроенное сообщение об ошибке клиенту, я использовал @ExceptionHandler в @ControllerAdvice для возврата ответа. Ниже мой код.

    @ControllerAdvice
    public class GlobalControllerExceptionHandler{
        @ExceptionHandler(MaxUploadSizeExceededException.class)
        @ResponseBody
        public ResponseEntity<?> maxUploadSizeExceededException(MaxUploadSizeExceededException e) {        
            String bodyJson = "{\"ErrorMessage\":\"Maximum upload size exceeded.\"}";
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).contentType(MediaType.TEXT_PLAIN).body(bodyJson);
        }
    }

То, что я хочу увидеть в swagger-ui.html, выглядит так:

    Response Body:
    {"ErrorMessage":"Maximum upload size exceeded."}

    Response Code:
    500

Но сейчас я не увидел никакого контента:

    Response Body:
    no content

    Response Code:
    0

Один ненормальный симптом, который я увидел на консоли браузера, заключается в том, что заголовок запроса

Предварительные заголовки показывают «Предварительные заголовки показаны»:

!Provisional headers are shown
Accept: */*
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryf7WjEeoDHtIm3ly1
Origin: http://localhost:8080
Referer: http://localhost:8080/SpringApp/swagger-ui.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
X-Requested-With: XMLHttpRequest

Я искал "Отображаются предварительные заголовки", кто-то объясняет, что, если такое сообщение отображается, это означает, что запрос фактически не отправлен. Но в моем случае я получил требование на стороне моего сервера приложений Spring, и я даже могу воспользоваться методом @ErrorHandler "maxUploadSizeExceededException".

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Я наконец выяснил причину. Ключевой симптом «Отображаются предварительные заголовки» обычно означает, что запрос не был отправлен. Но на самом деле я достиг точки останова в GlobalControllerExceptionHandler :: maxUploadSizeExceededException. Таким образом, объяснение «! Предварительные заголовки показаны» в моем случае должно быть таково, что запрос был отправлен, но данные не полностью отправлены из-за MaxUploadSizeExceededException (были загружены только частичные данные). В браузере, если запрос не завершен, ответ будет проглочен. Так что Swagger-UI не может отображать никакой ответ Если для загрузки файла используется команда curl, я могу получить ожидаемый ответ в выводе.

0 голосов
/ 17 января 2019

Swagger не анализирует вашу реализацию Java.

Если вы хотите добавить больше информации в документацию, вы должны использовать аннотации Swagger:

https://github.com/swagger-api/swagger-core/wiki/Annotations-1.5.X

В вашем случае что-то вроде:

@ApiResponses(value = { 
      @ApiResponse(code = 500, message = "Maximum upload size exceeded.")
})

Но вы должны добавить эту аннотацию в свой RestController. ControllerAdvice не считается чванством.

...