Spring Boot 2.1:@RestControllerAdvice中未捕获WebMvcConfigurer#addFormatters(...)中引发的异常

时间:2019-01-07 19:25:06

标签: spring spring-boot spring-mvc exception exception-handling

从Spring Boot 2.0更新到2.1之后,WebMvcConfigurer#addFormatters( FormatterRegistry registry )中引发的所有异常都不再被@RestControllerAdvice捕获。我将这种方法用于附加转换器。

例如:

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 );
    }
}

和controllerAdvice:

@RestControllerAdvice
public class Advice {

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

当我断点时,方法Status#findStatus(...)执行得很好,但是从未在@RestControllerAdvice中捕获异常。我究竟做错了什么? 非常感谢

1 个答案:

答案 0 :(得分:0)

Spring似乎包装了转换过程中引发的所有异常,并抛出了org.springframework.beans.TypeMismatchException而不是用户的自定义异常。

在我看来,这种行为是不正常的,如果在转换过程中引发了异常,则该异常应优先于所有框架的异常。因此,要解决此问题,我们必须extends ResponseEntityExceptionHandler并覆盖其protected ResponseEntity<Object> handleTypeMismatch(...)

感谢@Eric(那个人评论了上面的问题)。