Spring boot抛出异常会以/error的路径触发拦截器

最近在练手的项目中使用拦截器做登录认证的时候发现了一个问题
在这里插入图片描述
连续两个的结果集,似乎就是我只发了一次请求,但是返回的是有两个,然后就debugger
在这里插入图片描述
这里是我们正常的一个请求进入,我这里是直接放行了的,然后我在后面的业务中出现了一个异常,本以为会抛异常然后返回一个错误的结果集但是返回的确实上面的那样
在这里插入图片描述
本来应该到此结束返回一个结果集(没做全局异常处理,只做了一个拦截器来进行拦截到error的时候会封装成结果集)
但是!!!他又回到了拦截器而且有请求的uri
在这里插入图片描述
最后就是为了找到这个原因开始了debug之路,最后发现是SpringBoot 默认提供了一个全局的 handler 来处理所有的 HTTP 错误, 并把它映射为 /error。当发生一个 HTTP 错误, 例如 404 错误时, SpringBoot 内部的机制会将页面重定向到 /error 中。
解决方法是:
@ControllerAdvice自定义全局异常处理器来将异常处理封装好,因为是是在控制器处理请求之后执行的,就不会把异常丢出去了,spring boot的默认拦截器也没用了;

这是我第二次遇到这个问题了,但是我第一次遇见的时候是有全局异常处理器的,不过是因为写了两个拦截器来想模拟鉴权和认证出现的问题,当时没用记录,现在记一下。散会!

Spring Boot集成Activiti 7的过程中,如果你尝试通过监听器(如ExecutionListener、TaskListener等)去捕获Service Task内部的异常并通过BPMNError处理,可能会遇到一些挑战。首先,Activiti默认的行为是在Task完成后处理异常,这意味着在Service Task中直接抛出异常不会立即触发监听器的回调。 通常,执行监听器更适用于生命周期事件,比如任务开始、结束,而TaskListener则用于任务执行过程中的一些特定操作,比如完成条件检查。若Service Task内部有预期之外的错误,应该在业务逻辑处理层面上捕获并转换为BPMNError,然后使用ThrowExceptionEvent来主动抛出。 以下是可能的做法: 1. **自定义拦截器**:你可以创建一个实现了DelegateExecutionAware或ExecutionListener接口的自定义类,在onExecute或onTaskCompleted方法中添加对Service Task异常的处理逻辑。 ```java @Service("myCustomTaskListener") public class MyCustomTaskListener implements ExecutionListener { @Override public void notify(DelegateExecution execution) { try { // 业务代码 } catch (Exception e) { execution.setVariable("customError", new ErrorInfo(e.getMessage())); throw new BPMNException("Custom Exception", "An error occurred in the service task", e); } } // 其他TaskListener方法... } ``` 2. **异常处理器**:在Activiti的流程引擎配置中设置一个全局异常处理器,它会在执行上下文捕获到异常时调用。 ```java @Bean public GlobalExceptionHandler exceptionHandler() { return new GlobalExceptionHandler() { @Override protected void handleException(DelegateExecution execution, Throwable t) { if (t instanceof BPMNException) { BPMNError error = new BPMNError(((BPMNException) t).getErrorCode(), ((BPMNException) t).getText()); execution.setVariable("customError", error); } super.handleException(execution, t); } }; } ``` 在这种情况下,如果想在Service Task中直接抛出异常,并希望在监听器中捕获,你需要确保异常是通过BPMNError的形式传递的,这样才能在监听器中被识别和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值