GlobalExceptionHandler всегда возвращает 500 - PullRequest
0 голосов
/ 13 июня 2019

У меня есть следующий обработчик исключений:

@Log4j2
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)
public ResponseEntity handleException(Exception e) {
    logExceptionWithPath("Unhandled general exception", e);
    return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}

@ResponseBody
@ExceptionHandler({ValidationException.class})
public ResponseEntity<ErrorResponse> handleBindException(ValidationException ex) {
    logExceptionWithPath("Validation exception", ex);
    return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
}


@ResponseBody
@ExceptionHandler({BindException.class})
public ResponseEntity<ErrorResponse> handleBindException(BindException ex) {
    logExceptionWithPath("Bind exception", ex);
    return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
}

@ResponseBody
@ExceptionHandler(AmbiguousTermException.class)
public ResponseEntity<ErrorResponse> handleAmbiguousTermException(AmbiguousTermException ex) {
    logExceptionWithPath("AmbiguousTermException", ex);
    return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
}

Этот код должен обернуть исключения и вернуть ResponseEntity с правильным кодом состояния.

Но вместо этого я всегда получаю это:

{
"timestamp": 1560445348350,
"status": 500,
"error": "Internal Server Error",
"message": "I/O error on POST request for \"******": Error code:400 Message: ; nested exception is java.io.IOException: Error code:400 Message: ",
"path": "*****"
}

В журналах всегда есть сообщения, созданные logExceptionWithPath, поэтому кажется, что ExceptionHandler работает нормально, но где-то есть IOException.

Этот ответ похож для каждого исключения (и каждого @ExceptionHandler)

ниже несколько журналов из моего приложения и весны:

2019-06-13 17:26:00,237 DEBUG *:102 - assertTermsUnequivocal
2019-06-13 17:26:00,237 DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver:403 - Using @ExceptionHandler public org.springframework.http.ResponseEntity<*.ErrorResponse> *.GlobalExceptionHandler.handleAmbiguousTermException(*.AmbiguousTermException)
2019-06-13 17:26:00,238 ERROR *.GlobalExceptionHandler:92 - AmbiguousTermException for path: http://*/search
here stack trace from AmbiguousTermException
2019-06-13 17:26:00,239 DEBUG org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor:268 - Using 'application/json', given [text/plain, application/json, application/cbor, application/*+json, */*] and supported [application/json, application/*+json, application/json, application/*+json, application/cbor]
2019-06-13 17:26:00,239 DEBUG org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor:90 - Writing [*.ErrorResponse@17bd7832]
2019-06-13 17:26:00,240 DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver:143 - Resolved [*.AmbiguousTermException: terms are ambiguous]
2019-06-13 17:26:00,240 DEBUG org.springframework.web.servlet.DispatcherServlet:1130 - Completed 400 BAD_REQUEST

Это все из интересных журналов. Может быть, это вообще не связано с Spring, а с серверами, на которых он работает? В любом случае, если у вас есть какие-либо подсказки, почему это не работает, пожалуйста, оставьте ответ или комментарий.

1 Ответ

0 голосов
/ 13 июня 2019

Вы должны добавить статус ответа к методу, например @ResponseStatus(HttpStatus.NOT_FOUND)

@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST) // Added this annotation
@ExceptionHandler(AmbiguousTermException.class)
public ResponseEntity<ErrorResponse> handleAmbiguousTermException(AmbiguousTermException ex) {
    logExceptionWithPath("AmbiguousTermException", ex);
    return new ResponseEntity<>(new ErrorResponse(ex.getMessage()), HttpStatus.BAD_REQUEST);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...