Spring Boot 2.1: исключение, генерируемое в WebMvcConfigurer # addFormatters (...) не перехвачено в @RestControllerAdvice - PullRequest
0 голосов
/ 07 января 2019

После обновления с Spring Boot 2.0 до 2.1 все исключения, выданные в WebMvcConfigurer#addFormatters( FormatterRegistry registry ), больше не перехватываются в @RestControllerAdvice. Я использую этот метод для дополнительных преобразователей.

Например: *. * 1005

public class ConvertersContainer {

    public static class StringToStatusConverter implements Converter<String, Status> {

       @Override
       public Status convert( String source ) {
           return Status.findStatus( source );
       }
    }
}

И Status - это перечисление.

public enum Status {

   HAPPY("happy"), ANGRY("angry");

   private String title;

   public static Status findStatus( final String title) {
    return stream( values() )
            .filter( status-> status.getTitle().equals( title) )
            .findFirst()
            .orElseThrow( () -> new StatusNotFoundException( "...." ) );
   }
}

А StatusNotFoundException extends RuntimeException {}

Я зарегистрировал этот конвертер так:

@Configuration
public class ConverterRegister implements WebMvcConfigurer {

     @Override
    public void addFormatters( FormatterRegistry registry ) {
       registry.addConverter( new ConvertersContainer.StringToStatusConverter() );
       WebMvcConfigurer.super.addFormatters( registry );
    }
}

И контроллер Advice:

@RestControllerAdvice
public class Advice {

   @ExceptionHandler( StatusNotFoundException .class)
   protected String handleStatusNotFoundException(StatusNotFoundException ex) { ...   }
}

Когда я ставлю точку останова, метод Status#findStatus(...) хорошо выполняется, но исключение никогда не перехватывается в @RestControllerAdvice. Что я делаю неправильно? Большое спасибо

1 Ответ

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

Кажется, что Spring оборачивает все исключения, возникающие в процессе преобразования, и выдает org.springframework.beans.TypeMismatchException вместо пользовательского исключения.

На мой взгляд, это поведение не является нормальным, если во время преобразования возникает исключение, это исключение должно иметь приоритет над исключением всей платформы. Таким образом, чтобы решить эту проблему, мы должны extends ResponseEntityExceptionHandler и переопределить его protected ResponseEntity<Object> handleTypeMismatch(...).

Спасибо @Eric (парень прокомментировал вопрос выше).

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