未抛出 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 自定义全局异常处理程序