首页 > 其他分享 >dubbo~全局异常拦截器的使用与设计缺陷

dubbo~全局异常拦截器的使用与设计缺陷

时间:2024-06-07 10:33:11浏览次数:22  
标签:status dubbo 拦截器 200 Response 全局 ExceptionMapper public UniqueException

异常拦截器ExceptionMapper

在JAX-RS(Java API for RESTful Web Services)中,ExceptionMapper接口用于将Java异常映射到HTTP响应。通过实现ExceptionMapper接口,你可以自定义如何处理特定类型的异常,并生成相应的HTTP响应。

优先级和选择

当有多个ExceptionMapper可用于处理同一类型的异常时,JAX-RS会选择最具体的那个。例如,如果你有一个处理RuntimeException的ExceptionMapper和一个处理NullPointerException的ExceptionMapper,那么当抛出NullPointerException时,会选择处理NullPointerException的ExceptionMapper。

定义自定义异常

    public class UniqueException extends RuntimeException {

	public UniqueException(Throwable cause) {
		super(cause);
	}

	public UniqueException(String message) {
		super(message);
	}

	public UniqueException(String message, Throwable cause) {
		super(message, cause);
	}

}

实现ExceptionMapper

/**
 * 数据表约束异常处理器.
 *
 * @author lind
 * @date 2024/6/4 10:45
 * @since 1.0.0
 */
@Provider
public class DbViolationExceptionMapper implements ExceptionMapper<UniqueException> {

	@Override
	public Response toResponse(UniqueException exception) {

		return Response.status(Response.Status.BAD_REQUEST)
				.entity(MapUtil.builder().put("error", exception.getMessage()).build()).type(MediaType.APPLICATION_JSON)
				.encoding("utf-8").build();// 非200的请求,这个type无效,一直是text/plain

		/*
		 * return Response.status(Response.Status.OK)
		 * .entity(MapUtil.builder().put("error", exception.getMessage()).build())
		 * .type("application/json; charset=UTF-8").build();//
		 * 200的请求,是可以使用application/json的
		 *
		 */
	}

}

注册ExceptionMapper

在文件resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports添加内容

com.xx.exception.handler.DbViolationExceptionMapper

业务代码直接抛出异常

if (getCurrentUserId() == null || !getCurrentUserId().equals(userId)) {
	throw new UniqueException("权限不足");
 }

相关问题

  • 当在ExceptionMapper中返回的Response对象,状态码为200时,可以响应为application/json
  • 当Response对象状态码非200时,响应一直是text/plain

经过调试与排查,发现当非200时,在这个过滤器里,它出现了两个content-type,text/plain不知道是什么时间被加进去的,如图

方法执行到这里时,为响应头添加了text/plain

setStatus()方法如下

  public void setStatus(int status) {
        if (status > 200) {
            this.addOutputHeaders(RestHeaderEnum.CONTENT_TYPE.getHeader(), MediaType.TEXT_PLAIN.value);
        }

        this.status = status;
    }

这也是业务代码中,直接报出自定义异常,在ExceptionMapper捕获返回json没有生效的原因,这块感觉dubbo设计的不太好。

标签:status,dubbo,拦截器,200,Response,全局,ExceptionMapper,public,UniqueException
From: https://www.cnblogs.com/lori/p/18236716

相关文章

  • 全局 type 类型的寻找 typescript 类型 - fabric.Canvas
    全局type类型的寻找typescript类型-fabric.CanvasdeclaretypeExtCanvas=fabric.Canvas&{isDragging:boolean;lastPosX:number;lastPosY:number;};这个代码没有定义fabric.Canvas,然后看看提示说在namespace定义了。这个是子项目,没有type定义,上父项......
  • Dubbo源码解读-Dubbo心跳机制
    上篇我们介绍了消费端DubboInvoker的调用流程解析Dubbo源码解读-消费端DubboInvoker的调用流程解析_dubbo3使用invoker直接调用-CSDN博客        本文主要针Dubbo消费端/服务端心跳机制,从dubbo源码角度进行解析。    大家可以好好仔细读一下本文。有疑问......
  • validate方法进行表单异步校验时,回调函数内部避免使用全局变量
    对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个promise问题代码:save(){console.log(that.pos.indexName)console.log(that.pos.indexCode)......
  • 在 Windows 10 中全局安装 tree 命令
    在Windows10中全局安装tree命令的步骤如下:1.下载TreeforWindows工具包。可以从官方网站https://gnuwin32.sourceforge.net/packages/tree.htm下载最新版本的Binaries.zip压缩包。2.解压下载的Binaries.zip压缩包。在解压后的文件夹中,找到bin目录,里面有一个......
  • 嵌入式开发中广泛采用全局变量的考虑
    嵌入式开发中广泛采用全局变量的考虑2024-06-0210:26:57星期日在知乎上看到这个问题,C语言开发单片机为什么大多数都采用全局变量的形式?,才发觉在嵌入式开发中,使用全局变量的广泛程度远远高于纯软开发。在最近半年的TICC2530Zigbee开发和在实习单位的开发工作过程中,对全局变量......
  • Dubbo
    目录什么是RPC?Dubbo干什么?节点角色说明:调用关系说明:Registry服务注册中心ZookeeperZookeeper树型目录服务:服务提供方开发1.创建maven项目pom.xml文件中导入如下坐标2.配置web.xml文件3.创建服务接口4.创建服务实现类官网http://dubbo.apache.orgApacheDubbo是......
  • SpringBootWeb 篇-深入了解 Filter 过滤器与 Interceptor 拦截器(实现登录校验 Filter
    ......
  • spring:十、springMVC拦截器
    目录包结构坐标引入mvc配置文件springmvc.xmlweb.xml配置控制器拦截器多拦截器执行顺序:包结构坐标引入<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.......
  • Qt 设置全局字体
    在Qt中设置全局字体通常涉及两个步骤:首先加载所需的字体然后将其应用为应用程序范围内的默认字体。这可以通过在应用程序初始化时设置 QApplication 的字体属性来实现。以下是一个示例代码,展示了如何设置全局字体:1#include<QApplication>2#include<QFont>3......
  • springboot+seata+nacos+dubbo搭建分布式事务
    一、环境springboot:2.3.1.RELEASEdubbo:2.7.13seata:1.8nacos:zookeeper:3.7.1java11mysql8依赖:以下版本经测试无依赖冲突#父工程springboot版本<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent......