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

news/2025/3/12 0:47:46/文章来源:https://www.cnblogs.com/lori/p/18236716

异常拦截器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> {@Overridepublic 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设计的不太好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/721295.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPC--远程过程调用协议

简单介绍一下RPC什么是RPC? RPC的全称是:Remote Procedure Call,远程过程调用。它的作用就是允许一台机器上的程序去调用另一台机器上的程序,而不会意识到这个过程是远程的,也就是程序员不需要知道网络通信中的任何细节。 为什么要使用RPC?提高开发效率:程序员不需要再关…

echarts 曲线中显示最大值进行标签样式的设置和修改

曲线中最大值最小值需要完善一些相关的信息 let color = [ #ee6666, #73c0de, #3ba272, #fc8452, #9a60b4, #ea7ccc] let xData =[00:00, 04:00, 08:00, 12:00, 16:00, 20:00, 24:00] //item 是循环的后台返回的数据,用来构造有几条曲线 //关键代码还是markPoint中的内容 data…

终于搞懂了!原来vue3中template使用ref无需.value是因为这个

前言 众所周知,vue3的template中使用ref变量无需使用.value。还可以在事件处理器中进行赋值操作时,无需使用.value就可以直接修改ref变量的值,比如:<button @click="msg = Hello Vue3">change msg</button>。你猜vue是在编译时就已经在代码中生成了.…

用 Python 撸一个 Web 服务器-第2章:Hello World

从一个 Hello World 程序说起 要编写 Web 服务器,需要用到一个 Python 内置库 socket。Socket 是一个比较抽象的概念,中文叫套接字,它代表一个网络连接。两台计算机之间要进行通讯,大概分为三个步骤:建立连接,传输数据,关闭连接。而 socket 库为我们提供了这个能力。 按…

go pool

来自: sync.Pool 原理 sync.Pool 核心对象有三个New:函数,负责对象初始化 Get:获取 Pool 中的对象,如果 Pool 中对象不存在则会调用 New Put:将对象放入 Pool 中New func Pool 的结构很简单,就 5 个字段 type Pool struct { ... New func() interface{} }字段 New 是…

CSP历年复赛题-P2119 [NOIP2016 普及组] 魔法阵

原题链接:https://www.luogu.com.cn/problem/P2119 题意解读:在一组数里找出所有的Xa,Xb,Xc,Xd的组合,使得满足Xa<Xb<Xc<Xd, Xb-Xa=2(Xd-Xc), Xb-Xa<(Xc-Xb)/3,并统计出每个数作为A,B,C,D出现的次数。 解题思路: 1、枚举(O(n^4)) 首先想到的是通过4重循环枚…

应用解析 | 面向智能网联汽车的产教融合解决方案

经纬恒润融合二十多年的行业经验,将实际的工程应用、项目需求引入到产教融合中,打破院校与企业之间的界限,做到所学即所用,毕业即就业。 背景介绍随着科技的飞速发展,智能网联汽车已成为汽车产业的新宠,引领着未来出行的潮流。然而,行业的高速发展也带来了对高素质技术技…

PTA大作业4-6总结

前言 这三次大作业使用到的新知识点并不是很多,主要还是以继承与多态为主,虽然在新知识点上并没有增加许多,但明显在类的构造,类与类之间的关联设计方面难度明显有较大的增加,题量方面明显还是和之前三次大作业一样,每次大作业都是以一题为主,其余的题目都是为了巩固基础…

.NET之Hangfire快速入门和使用

原文地址:.NET之Hangfire快速入门和使用 - 追逐时光者 - 博客园 (cnblogs.com)前言:定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quar…

插值技术研究

过采样与欠采样&图像重采样(上采样&下采样) 研究图像插值技术:2016年苏州大学的钟宝江等人《图像插值技术综述》[1]图像插值利用图像已知采样点的灰度值估计未知采样点的灰度值,是图像数据的一种生成过程 。 图像插值的目的在于通过升采样的方式提高图像的分辨率。…

科研日记4【2024-06-06】

实验高度向稀疏采样造成的整行缺失使得在高度向上出现严重混叠现象, 对高度向稀疏采样的数据首先利用线性插值恢复补全,再将部分插值去掉,以模拟二维随机降采样。 实验结果说明上述方法并不好。 高度向50%稀疏直接成像:高度向50%稀疏-不动迭代成像:高度向50%稀疏-线性插值…

活动预热丨在 AGI Playground 2024 遇见一群 RTE+AI 的 Builders

6 月 22、23 日,北京。AGI Playground 2024,这个夏日最火热的 AGI 盛会。王小川、杨植麟等 AGI 创业者悉数参加。RTE 开发者社区的 builders 和 RTE Open Day 也将在现场!我们将为大家呈现两大板块: 01 实时开发挑战 Workshop RTE 开发者社区将联合「零一万物」发起 worksh…