spring - Spring Boot 2.1:WebMvcConfigurer#addFormatters(...) 中引发的异常未在 @RestControllerAdvice 中捕获
问题描述
从 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 );
}
}
和控制器建议:
@RestControllerAdvice
public class Advice {
@ExceptionHandler( StatusNotFoundException .class)
protected String handleStatusNotFoundException(StatusNotFoundException ex) { ... }
}
当我断点时,该方法Status#findStatus(...)
执行得很好,但异常从未在@RestControllerAdvice
. 我究竟做错了什么?非常感谢
解决方案
似乎 Spring 包装了转换过程中抛出的所有异常,并抛出了一个org.springframework.beans.TypeMismatchException
而不是用户的自定义异常。
在我看来这种行为是不正常的,如果在转换过程中抛出异常,这个异常应该优先于所有框架的异常。所以要解决这个问题,我们必须extends ResponseEntityExceptionHandler
重写它的protected ResponseEntity<Object> handleTypeMismatch(...)
.
谢谢@Eric(那个人评论了上面的问题)。
推荐阅读
- javascript - 等待 fs.promises 列表
- git - windows下通过cmd独立调用git-credential-manager-core.exe?
- javascript - 如何在 ejs 中更改部分弹出窗口
- php - Laravel 更新不返回数据
- python-3.x - 使用python从日期的左侧和右侧删除字符串
- django - Django、celery 和 kombu:如何允许泡菜?
- email - 使用 .net 在 Visual Studio 中发送电子邮件
- javascript - 列表中的每个孩子都应该有一个唯一的“关键”道具。检查 `Form` 的渲染方法
- java - 我们可以在类级别对象上使用等待和通知吗?它的表现如何?
- amazon-web-services - 如何按顺序处理在多个 EC2 实例上执行的作业?