You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vert.x如何为所有路由全局注册failureHandler?

如何为Vert.x路由注册全局failureHandler?

你遇到的问题是不想逐个给路由添加重复的failureHandler,用/*路径注册的方式不生效,这里提供两种可行的全局错误处理方案:

方案1:根路由兜底failureHandler

直接在根Router上注册不带路径的failureHandler,作为所有路由的错误兜底处理,只要路由未自行处理错误,就会触发这个全局处理器。

注意要把全局处理器的注册放在所有业务路由之后,确保路由匹配顺序正确:

// 先定义所有业务路由
router.get "/api/$name/:id" handler this.&details
router.post "/api/$name" consumes JSON produces JSON handler this.&save
router.delete "/api/$name/:id" handler this.&delete
// ...其他业务路由

// 注册全局failureHandler
router.route().failureHandler(this.&handleError)

方案2:按HTTP状态码全局处理

如果需要针对特定状态码做统一错误处理,可以使用Router.errorHandler方法,比如处理500错误:

// 全局处理500错误
router.errorHandler(500, this.&handleError)

// 可额外添加其他状态码的处理逻辑,比如404
router.errorHandler(404) { rc ->
    rc.response()
        .setStatusCode(404)
        .putHeader('content-type', JSON)
        .end('{"message":"资源不存在"}')
}

为什么router.route('/*')的方式不生效?

/*是具体路径匹配规则,只会匹配路径完全符合/*的请求,而你的业务路由都是/api/xxx这类更具体的路径,请求会优先匹配业务路由,不会触发/*的failureHandler。只有根路由的route()不带路径时,才会匹配所有请求并作为兜底处理。

你定义的handleError方法可以直接复用,无需修改:

void handleError( RoutingContext rc ) {
    Throwable failure = rc.failure()
    log.error failure.message, failure
    rc.response()
        .setStatusCode(500)
        .putHeader('content-type', JSON)
        .end("""{ "message":"$failure.message"}""")
}

内容的提问来源于stack exchange,提问作者injecteer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:06:24