当前位置: 首页 > 知识库问答 >
问题:

Spring Boot 2.1:异常抛出在WebMvcConfigrer#addFor事(...)未捕获在@RestControlller忠告

范文昌
2023-03-14

从Spring Boot 2.0更新到2.1后,在@RestControllerAdvice中不再捕获WebMVCConfiguer#addFormatters(FormatterRegistry注册表)中抛出的所有异常。我将此方法用于附加转换器。

如。:

public class ConvertersContainer {

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

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

状态是一个枚举。

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扩展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中从未捕捉到异常。我做错了什么?谢谢


共有1个答案

柳英资
2023-03-14

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

在我看来,这种行为是不正常的,如果在转换过程中抛出异常,该异常应该优先于所有框架的异常。所以要解决这个问题,我们必须扩展ResponseEntityExceptionHandler并覆盖其受保护的ResponseEntity

谢谢@Eric(这家伙评论了上面的问题)。

 类似资料:
  • 嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)

  • 我有以下2个代码片段,我想知道是什么使java编译器(在Eclipse与Java7)显示错误的第二个片段,为什么不是第一个。 以下是代码片段: 片段1 片段2 在eclipse中,snippet1显示为finally块添加'SuppressWarning',但在snippet2中,它显示为catch块中的throw语句添加'throws或try catch'块。 我详细研究了以下问题,但没有提供任

  • 我们使用带有Log4j的springaop来登录我们的应用程序。我在应用程序中实现了@Before、@After、@posterhrowing建议。但我面临以下问题: 当任何异常在catch块中被捕获时,它不会调用@afterhrowing通知来打印错误堆栈跟踪。 我想为catch块中捕获的异常打印“错误堆栈跟踪”。意味着无论何时在try块中发生任何异常并被catch捕获,都应该调用一些建议来打印

  • 问题 你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。 解决方案 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如: >>> def example(): ... try: ... int('N/A') ... except ValueError as e:

  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 我有一个方面类,用于记录使用泛型方法之前和之后(周围)的方法执行情况: 在方法中,我抛出了一个在logMethod中捕获的可抛出异常,并抛出了一个自定义异常,而不是类型 在我的控制器建议中,我有以下内容: 项目结构: 控制台: