Не удается обработать исключение JDBCConnectionException при весеннем отдыхе с пользовательским обработчиком исключений - PullRequest
0 голосов
/ 25 сентября 2019

Я использую глобальный обработчик исключений в своем приложении весеннего отдыха, и я хотел бы скрыть исключения jdbc, но он не работает должным образом.Я закрыл базу данных, чтобы вызвать исключение соединения, и я вижу следующее исключение в журнале, и я получаю ответ об ошибке пружины по умолчанию, но не тот, который я определил в обработчике исключений

java.lang.IllegalStateException: Could not resolve parameter [1] in public org.springframework.http.ResponseEntity<java.lang.Object> ...
throws java.io.IOException: No suitable resolver

Воткод.

@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler({JDBCConnectionException.class})
    public ResponseEntity<Object> dbError(JDBCConnectionException exception,
            HttpHeaders headers,
            HttpStatus status,
            WebRequest request) throws IOException
    {
        Map<String,Object> body = new HashMap<>();

        body.put("errorId",Long.valueOf(201));
        body.put("state",HttpStatus.SERVICE_UNAVAILABLE.value());
        body.put("message", "internal failure");
        body.put("time", new Date().toString());
        return new ResponseEntity<>(body, headers, status);
    }

Надеюсь, вы поможете мне.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

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

HttpHeaders headers,
HttpStatus status

Это исключение, упомянутое исключение paramter [1]

java.lang.IllegalStateException: Could not resolve parameter [1] in public org.springframework.http.ResponseEntity<java.lang.Object> ...
throws java.io.IOException: No suitable resolver

Я удалил эти два параметра, и обработчик исключений обрабатывает исключение.

Этот код теперь работает

@ExceptionHandler(JDBCConnectionException.class)
    public ResponseEntity<Object> dbError(Exception ex,
            WebRequest request) 
    {
        Map<String,Object> body = new HashMap<>();

        body.put("errorId",Long.valueOf(201));
        body.put("state",HttpStatus.SERVICE_UNAVAILABLE.value());
        body.put("message", "internal failure");
        body.put("time", new Date().toString());
        return new ResponseEntity<Object>(body, HttpStatus.INTERNAL_SERVER_ERROR);
    }
0 голосов
/ 25 сентября 2019

Поскольку аннотация подразумевает, что @ControllerAdvice используется как расширение на ваших конечных точках REST, эти обработчики исключений будут обрабатывать исключение для REST API и не влияют на то, как оно регистрируется в консоли.Вместо этого он определит, как исключения сообщаются вашим конечным пользователям, и позволит вам писать краткие сообщения об ошибках без утечки информации о вашей программе.

Если вы хотите полностью перехватить исключение, а не только для REST API, примитепосмотрите на этот блог .

Однако я бы не рекомендовал делать это, так как это значительно уменьшит объем информации, доступной вам как разработчику, эта информация не будет видна конечным пользователям, и поэтому пользовательское исключение REST API должно обеспечивать достаточную абстракцию.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...