未抛出 spring webflux 的自定义异常

Posted

技术标签:

【中文标题】未抛出 spring webflux 的自定义异常【英文标题】:Custom exception with spring webflux not thrown 【发布时间】:2021-03-11 10:28:35 【问题描述】:

我试图在找不到 Resource 时抛出自定义异常,不知何故自定义异常被 SpringFramework 覆盖并且未显示自定义消息。下面是我写的自定义异常

@ResponseStatus(code = HttpStatus.NOT_FOUND)
public class SkeletonNotFoundException extends RuntimeException 
    public SkeletonNotFoundException(String message) 
       super(message);
     

我想在找不到Mono时抛出上面的异常,下面是找到A资源并抛出错误的逻辑

@GetMapping(value = "/skeletonId")
public Mono<ResponseEntity<?>> getSkeleton(@PathVariable final Long skeletonId) 
    return skeletonService.findById(skeletonId)
            .switchIfEmpty(Mono.error(new SkeletonNotFoundException("Skeleton not found")))
            .map(skeleton -> this.skeletonMapper.mapToDto(skeleton))
            .map(body -> ResponseEntity.ok().body(body));

以下是我向端点发送请求时从邮递员那里得到的结果


"timestamp": "2020-11-29T06:15:26.935+00:00",
"path": "/api/v1/skeletons/3",
"status": 404,
"error": "Not Found",
"message": "",
"requestId": "2094d9b0-1"

我看不到我的自定义消息,不知何故另一层覆盖了 CustomException

【问题讨论】:

为了排除任何其他问题,我建议开发(即使是暂时的)自定义ErrorWebExceptionHandler。这样,您将确定返回的404 是否与此类异常相关。几个例子:baeldung.com/spring-webflux-errors和***.com/questions/47958622/… 我可以通过@RestControllerAdvice 解决它,我会检查您指出的链接 Baeldung 提供的异常处理是一个不好的例子,不应使用。关闭该文章的 cmets 是有原因的。相反,官方文档中提供的异常处理是应该查看的。如果使用带注释的控制器,您可以使用控制器建议注释并像任何 Spring Boot 应用程序一样处理异常。正如这里提到的docs.spring.io/spring-framework/docs/current/reference/html/… 只有当您需要处理在选择处理程序之前抛出的异常时才需要自定义 WebExceptionHandler,例如在 WebFilters 中抛出的异常。堆栈溢出链接示例中清楚地指出了这一点。 @Kamal 我的建议是排除之前的任何其他问题。但是,如果您使用@RestControllerAdvice 进行了测试,则很明显问题出在“其他部分”。不确定你使用的Webflux版本,有一个相关的问题:github.com/spring-projects/spring-boot/pull/19901我刚刚创建了一个最新的虚拟项目,在skeletonService.findById(skeletonId)中返回Mono.empty(),它按预期工作,即@987654334 @ 包含在响应 message 属性中。 【参考方案1】:

问题可以通过如下属性配置解决:

server.error.include-message: always

【讨论】:

【参考方案2】:

我使用 Spring 的 @RestControllerAdvice 来显示自定义异常

【讨论】:

以上是关于未抛出 spring webflux 的自定义异常的主要内容,如果未能解决你的问题,请参考以下文章

赋值操作期间未抛出空指针异常

缺少资源 bean:Spring Boot webflux 自定义全局异常处理程序

对话框片段已添加异常未抛出

未抛出 Spring Security SAML DisabledException

捕获程序未抛出的异常

抛出异常时,Spring Boot 不显示自定义错误