【发布时间】: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和stackoverflow.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属性中。
标签: spring spring-boot spring-webflux