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
相关产品推荐
相关产品推荐

