dubbo~全局异常拦截器的使用与设计缺陷
异常拦截器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设计的不太好。
dubbo~全局异常拦截器的使用与设计缺陷的更多相关文章
- Spring Cloud Gateway之全局异常拦截器
/** * @version 2019/8/14 * @description: 异常拦截器 * @modified: */ @Slf4j public class JsonExceptionHand ...
- Asp.Netcore使用Filter来实现接口的全局异常拦截,以及前置拦截和后置拦截
原文链接:https://blog.csdn.net/qq_38762313/article/details/85234594 全局异常拦截器: 解决写每个接口都需要去做容错而添加try{ ...
- 我心中的核心组件(可插拔的AOP)~第四回 异常拦截器
回到目录 之前说过有关拦截器的文章,第二回 缓存拦截器,事实上,在那讲里说的最多是AOP和缓存组件,对于拦截的概念并没有详细的说明,这一讲,不说AOP,主要说一下拦截器,拦截器Interceptio ...
- Java自定义异常类以及异常拦截器
自定义异常类不难,但下面这个方法,它的核心是异常拦截器类. 就算是在分布式系统间进行传递也可以,只要最顶层的服务有这个异常拦截器类(下例是在 springboot 项目中) 1.自定义异常类,继承自 ...
- Spring 全局异常拦截根据业务返回不同格式数据 自定义异常
1.全局异常拦截:针对所有异常进行拦截 可根据请求自定义返回格式 2.自定义异常类 处理不同业务的异常 接下来开始入手代码: 1).自定义异常类 @ControllerAdvice//添加注解 记得开 ...
- SpringBoot全局异常拦截
SpringBoot全局异常捕获 使用到的技能 @RestControllerAdvice或(@ControllerAdvice+@ResponseBody) @ExceptionHandler 代码 ...
- SpringBoot 全局异常拦截捕获处理
一.全局异常处理 //Result定义全局数据返回对象 package com.xiaobing.demo001.domain; public class Result { private Integ ...
- Dubbo自定义日志拦截器
前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...
- @ControllerAdvice全局异常拦截
@ControllerAdvice 拦截异常并统一处理 在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder ...
- springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理
本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文都是springboot的常用和实用功能,话不多说开始吧 定时任务 1.启动类开启注解 @EnableScheduling //开启基于注解 ...
随机推荐
- Java面试题:细数ThreadLocal大坑,内存泄露本可避免
一.背景ThreadLocal是Java中用于解决多线程共享变量导致的线程安全问题的一种机制.它为每个线程分配一个独立的变量副本,从而避免了线程间的数据竞争.这个我们从上一篇文章<Java面试题 ...
- 系列解读 SMC-R (二):融合 TCP 与 RDMA 的 SMC-R 通信 | 龙蜥技术
简介:本篇以 first contact (通信两端建立首个连接) 场景为例,介绍 SMC-R 通信流程. 文/龙蜥社区高性能网络SIG 一.引言 通过上一篇文章 <系列解读SMC-R:透 ...
- Java依赖冲突高效解决之道
简介:由于阿里妈妈联盟团队负责业务的特殊性,系统有庞大的对外依赖,依赖集团六七十个团队服务及N多工具组件,通过此文和大家分享一下我们积累的一些复杂依赖有效治理的经验,除了简单技术技巧的总结外,也会探 ...
- 智能数据构建与管理平台Dataphin的前世今生:缘起
简介: 阿里巴巴提出的OneData方法论帮助企业捋清了数据全生命周期的管理思路,更将其植入到产品Dataphin(智能数据构建与管理)中,通过阿里云为企业提供服务. Dataphin 智能数据构建与 ...
- h5开发,原生开发,混合开发
这里做一点对h5开发,原生开发,混合开发的笔记,记一点更新一点: 一.h5开发:html,css和js编写页面和业务逻辑. 1..页面栈上,h5通过history来管理回退或者前进.vue通过配置路由 ...
- Jmeter-线程组下篇
线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要.线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下. 可以将线程组视为一个虚拟用户池,其中每个 ...
- rbenv 使用指南
https://github.com/rbenv/rbenv https://www.cnblogs.com/yiluhuakai/p/9414730.html https://ruby-china. ...
- LocalDateTime 时间偏移量的处理
一.代码处理块 // 当前系统时间两年后的时间 LocalDateTime expirationTime = LocalDateTimeUtil.offset(LocalDateTime.now(), ...
- uniapp中利用renderjs引入leaflet
由于uniapp中要使用地图,虽然uni-app有地图组件map,但是很难用,而且性能很差.在app中是不能操作dom,所以直接用leaflet是不可能的.最终发现了renderjs,官网提出,在ap ...
- C语言:实现数组的删除和增加
/* 删除方法: 如:12 32 56 84 95 用覆盖的方法 若删除第三个,则第四个要覆盖第三个,第五个要覆盖第四个 覆盖完:12 32 84 ...