Vert.x 4 Web 应用异常全局统一拦截处理

编程教程 > Java > Vert.x (332) 2024-11-26 14:39:04

前言

引用之前的例子《Vert.x 4 Web REST CRUD接口应用》项目作为基础进行修改,创建一个自定义异常和异常拦截处理器。以实现

  • 对指定异常返回特殊数据
  • 对未指定异常返回通用错误

项目结构参考

Vert.x 4 Web 应用异常全局统一拦截处理_图示-4c0c9ad7e437488382b0008af62aef46.png

基于上一篇项目用到的类,新增了红色圈出来的类。

 

引入开发工具组件lombok

maven pom.xml 依赖模块添加以下依赖:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
<version>1.18.34</version>
</dependency>

 

新增自定义异常BusinessException

@EqualsAndHashCode(callSuper = true)
@Data
public class BusinessException extends RuntimeException{
private int code=480;
private String msg;


public BusinessException() {
this.msg="未知错误或空指针";
}

public BusinessException(int code, String msg) {
this.code = code;
this.msg = msg;
}

public BusinessException(String message) {
super(message);
this.msg=message;
}

public BusinessException(String message, Throwable cause) {
super(message, cause);
this.msg=message;
}

public BusinessException(Throwable cause) {
super(cause);
this.msg=cause.getMessage();
}

public BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
this.msg=message;
}


}

 

创建异常处理器DefaultExceptionHandler

 

public class DefaultExceptionHandler implements Handler<RoutingContext> {

public DefaultExceptionHandler() {

}

@Override
public void handle(RoutingContext routingContext) {
Throwable throwable = routingContext.failure();
if (throwable == null) {
routingContext.response()
.setStatusCode(200)
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodeToBuffer(Result.fail(480,"未知错误")));
return;
}

if (throwable instanceof NullPointerException) {
routingContext.response()
.setStatusCode(200)
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodeToBuffer(Result.fail(480,"空指针")));
}

if (throwable instanceof BusinessException businessException) {
routingContext.response()
.setStatusCode(200)
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodeToBuffer(Result.fail(businessException.getCode(), businessException.getMsg())));
return;
}
//其他没有指明的统一输出500
routingContext.response()
.setStatusCode(200)
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodeToBuffer(Result.fail(500, "系统内部错误")));

}

public static DefaultExceptionHandler of() {
return new DefaultExceptionHandler();
}
}

 

在路由处引入拦截器

聚焦代码

//必须加 last()排序到最后兜底
router.route().last().failureHandler(DefaultExceptionHandler.of());

 

编辑get 接口实现

/**
* 通过路径参数id获取单个产品
* @param routingContext 路由上下文
*/
private void getById(RoutingContext routingContext){
String id = routingContext.pathParam("id");
Whisky whisky = products.get(Integer.parseInt(id));
if (whisky == null) {
throw new BusinessException(481,"未找到相关产品信息:id-"+id);
}
routingContext.response()
.putHeader("content-type", "application/json; charset=utf-8")
.end(Json.encodePrettily(whisky));
}

 

使用postman 访问接口

Vert.x 4 Web 应用异常全局统一拦截处理_图示-729cd6a08c4942bb8d5bf79004a66721.png

 

从上图可以看到 参数为2 正确找到产品信息,参数为3则报错未找到,错误代码为我们指定的额481与预期效果一致。

 

 

Vert.x 4 Web 应用异常全局统一拦截处理_图示-7eee497c29964c6eadf9fdecb46e55a2.png
输入一个不是数字的参数

输入一个非数字参数由于代码运行时候报错无法转换,而该异常并未指定特殊错误返回所以返回的全局默认错误500 + 系统内部错误,与预期效果一致。

 

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
前言项目由之前的第一个vert.x 4 项目改编而来,vert.x项目创建参考: vert.x 4 web应用编写修改MainVerticle文件,内容如下:p
前言Vert.x 中实现全局数据共享,如环境参数等。Vertx数据共享实现共享数据存入/更新SharedData sharedData = vertx.shar
Vert.x java 入门,Vert.x这个框架在常规的web业务开发中估计还不是很成熟。但是了解了他的一些原理我觉得可以有一番作为。今天主要简单讲解下eclipse Vert.x是什么有什么...
前言项目创建参考之前的《Vert.x 4 Web应用初识》。本文通过Vert.x实现了REST接口的CRUD操作。通过本教程你可以获得以下内容vert.x项目中
前言引用之前的例子《Vert.x 4 Web REST CRUD接口应用》项目作为基础进行修改,创建一个自定义异常和异常拦截处理器。以实现对指定异常返回特殊数据
前言这里主要讲解Vert.x配置文件的读取和使用,引用之前的项目《Vert.x 4 Web应用初识》 引入必要依赖maven pom.xml&lt;dependenc
前言最新的Ver.x 4 从idea工具运行启动,并访问。项目创建通过vert.x官网生成器完成。Vert.x 4项目创建打开vert.x官网项目生成地址,ht
前言文件上传在web应用比较常见,本文以vert.x web实现文件上传功能。引用之前的项目《Vert.x 4 Web应用初识》作为基础,添加了日志。 Vert
前言接上一篇《Vert.x 4 Web应用初识》,在web应用中除了访问地址得到动态的信息还有静态的资源库访问,如 jQuery / bootstrap 等前端
前言引用《Vert.x 4 Web REST CRUD接口应用》项目,加入日志依赖并编码实现类似Interceptor功能处理。vert.x日志集成参考《Ver
前言vert.x 默认是没有像spring的依赖注入的,需要自己结合vertx-service-proxy插件实现。本文引用项目为基础《Vert.x 4 Web
前言Vert.x Router路由中多个处理器之间通过RoutingContext共享数据实现。 Vert.x Router 上下文数据数据设置routingC
前言创建一个常规的web项目肯定需要一个模板引擎来实现,引用之前的项目《Vert.x 4 Web应用初识》基础结构目前vert.x支持多款模板引擎,包括:MVE
前言Web项目开发一般接口入参都有校验需求,Vert.x 4 目前已有插件实现参数校验,引用之前的项目《Vert.x 4 Web应用初识》源码 引入验证插件ma
前言前面已经学习了Vert.x web的基础接口,本文主要讲解引入jwt为接口认证/鉴权。引用之前创建的项目《Vert.x 4 Web应用初识》,加入jwt t