学做网站需要什么基础seo网站优化推广教程
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:02
当前位置: 首页 > news >正文
学做网站需要什么基础,seo网站优化推广教程,做金融行业网站,做网站的公司有哪些岗位一.问题描述 Dubbo远程服务提供者抛出的自定义异常无法被消费方正常捕获#xff0c;消费方捕获的自定义异常全部变成RuntimeException#xff0c;使用起来很不方便。 二.原因分析 相关源码 /** Licensed to the Apache Software Foundation (ASF) under one or more* con…一.问题描述 Dubbo远程服务提供者抛出的自定义异常无法被消费方正常捕获消费方捕获的自定义异常全部变成RuntimeException使用起来很不方便。 二.原因分析 相关源码 /** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the License); you may not use this file except in compliance with* the License. You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an AS IS BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License./ package org.apache.dubbo.rpc.filter;import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.service.GenericService; import org.apache.dubbo.rpc.support.RpcUtils;import java.lang.reflect.Method;import static org.apache.dubbo.common.constants.LoggerCodeConstants.CONFIG_FILTER_VALIDATION_EXCEPTION;/** ExceptionInvokerFilter* p* Functions:* ol* liunexpected exception will be logged in ERROR level on provider side. Unexpected exception are unchecked* exception not declared on the interface/li* liWrap the exception not introduced in API package into RuntimeException. Framework will serialize the outer exception but stringnize its cause in order to avoid of possible serialization problem on client side/li* /ol*/ Activate(group CommonConstants.PROVIDER) public class ExceptionFilter implements Filter, Filter.Listener {private ErrorTypeAwareLogger logger LoggerFactory.getErrorTypeAwareLogger(ExceptionFilter.class);Overridepublic Result invoke(Invoker? invoker, Invocation invocation) throws RpcException {return invoker.invoke(invocation);}Overridepublic void onResponse(Result appResponse, Invoker? invoker, Invocation invocation) {if (appResponse.hasException() GenericService.class ! invoker.getInterface()) {try {Throwable exception appResponse.getException();// directly throw if its checked exceptionif (!(exception instanceof RuntimeException) (exception instanceof Exception)) {return;}// directly throw if the exception appears in the signaturetry {Method method invoker.getInterface().getMethod(RpcUtils.getMethodName(invocation), invocation.getParameterTypes());Class?[] exceptionClasses method.getExceptionTypes();for (Class? exceptionClass : exceptionClasses) {if (exception.getClass().equals(exceptionClass)) {return;}}} catch (NoSuchMethodException e) {return;}// for the exception not found in methods signature, print ERROR message in servers log.logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, , ,Got unchecked and undeclared exception which called by RpcContext.getServiceContext().getRemoteHost() . service: invoker.getInterface().getName() , method: RpcUtils.getMethodName(invocation) , exception: exception.getClass().getName() : exception.getMessage(), exception);// directly throw if exception class and interface class are in the same jar file.String serviceFile ReflectUtils.getCodeBase(invoker.getInterface());String exceptionFile ReflectUtils.getCodeBase(exception.getClass());if (serviceFile null || exceptionFile null || serviceFile.equals(exceptionFile)) {return;}// directly throw if its JDK exceptionString className exception.getClass().getName();if (className.startsWith(java.) || className.startsWith(javax.) || className.startsWith(jakarta.)) {return;}// directly throw if its dubbo exceptionif (exception instanceof RpcException) {return;}// 这里把其它情况的异常都改为RuntimeException抛出// otherwise, wrap with RuntimeException and throw back to the clientappResponse.setException(new RuntimeException(StringUtils.toString(exception)));} catch (Throwable e) {logger.warn(CONFIG_FILTER_VALIDATION_EXCEPTION, , ,Fail to ExceptionFilter when called by RpcContext.getServiceContext().getRemoteHost() . service: invoker.getInterface().getName() , method: RpcUtils.getMethodName(invocation) , exception: e.getClass().getName() : e.getMessage(), e);}}}Overridepublic void onError(Throwable e, Invoker? invoker, Invocation invocation) {logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, , ,Got unchecked and undeclared exception which called by RpcContext.getServiceContext().getRemoteHost() . service: invoker.getInterface().getName() , method: RpcUtils.getMethodName(invocation) , exception: e.getClass().getName() : e.getMessage(), e);}// For test purposepublic void setLogger(ErrorTypeAwareLogger logger) {this.logger logger;} } 源码中只有以下几种情况会直接抛出异常
- 非RuntimeException直接抛出异常 2. 如果是checked异常直接抛出 3. 在方法签名上有声明直接抛出 4. 异常类和接口类在同一个jar包直接抛出 5. 是JDK自带的包名以java、javax、jakarta开头的异常直接抛出 6. 是dubbo本身的RpcException异常直接抛出 这样的话那最简单的方案就是重写ExceptionFilter在识别到我们程序自定义异常时也return就可以在消费端正常捕获并处理异常 三.解决方法 1.重写ExceptionFilter的onResponse方法 public class DubboExceptionFilter extends ExceptionFilter {private ErrorTypeAwareLogger logger LoggerFactory.getErrorTypeAwareLogger(ExceptionFilter.class);/*redis校验异常 字符串/private static final String REDIS_VALID_EXCEPTION_TEXT RedisValidException;Overridepublic void onResponse(Result appResponse, Invoker? invoker, Invocation invocation) {if(!appResponse.hasException() || GenericService.class invoker.getInterface()) {return;}try {Throwable exception appResponse.getException();// directly throw if its checked exceptionif (!(exception instanceof RuntimeException) (exception instanceof Exception)) {return;}/————————————–自定义的异常处理——————————————–/if(exception instanceof BusinessFailException) {return;}//如果还有其它需要直接抛出的异常也在这里处理/————————————–自定义的异常处理——————————————–/// directly throw if the exception appears in the signaturetry {Method method invoker.getInterface().getMethod(invocation.getMethodName(), invocation.getParameterTypes());Class?[] exceptionClasses method.getExceptionTypes();for (Class? exceptionClass : exceptionClasses) {if (exception.getClass().equals(exceptionClass)) {return;}}} catch (NoSuchMethodException e) {return;}// for the exception not found in methods signature, print ERROR message in servers log.logger.error(CONFIG_FILTER_VALIDATION_EXCEPTION, , , Got unchecked and undeclared exception which called by RpcContext.getServiceContext().getRemoteHost() . service: invoker.getInterface().getName() , method: invocation.getMethodName() , exception: exception.getClass().getName() : exception.getMessage(), exception);// directly throw if exception class and interface class are in the same jar file.String serviceFile ReflectUtils.getCodeBase(invoker.getInterface());String exceptionFile ReflectUtils.getCodeBase(exception.getClass());if (serviceFile null || exceptionFile null || serviceFile.equals(exceptionFile)) {return;}// directly throw if its JDK exceptionString className exception.getClass().getName();if (className.startsWith(java.) || className.startsWith(javax.)) {return;}// directly throw if its dubbo exceptionif (exception instanceof RpcException) {return;}// 除了以上所有的异常其它异常都改为RuntimeException抛出appResponse.setException(new RuntimeException(StringUtils.toString(exception)));} catch (Throwable e) {logger.warn(CONFIG_FILTER_VALIDATION_EXCEPTION, , , Fail to ExceptionFilter when called by RpcContext.getServiceContext().getRemoteHost() . service: invoker.getInterface().getName() , method: invocation.getMethodName() , exception: e.getClass().getName() : e.getMessage(), e);}} } 2.配置让自定义Filter生效 在服务提供方resources目录下创建META-INF/dubbo文件夹,在新建的文件夹下创建org.apache.dubbo.rpc.Filter文件文件内容为 dubboExceptionFilter你的包名.DubboExceptionFilter 3.修改配置 以properties配置为例 #自定义的异常捕获filter dubbo.provider.filterdubboExceptionFilter,-exception 四.Dubbo版本 3.1.6的问题 dubbo 3.1.6以上版本提高了序列化安全检查强度自定义的异常抛出时会因为安全问题无法序列化 配置文件中加入以下配置可解决 #检查模式级别改为WARN dubbo.application.serialize-check-statusWARN 问题参考 Dubbo新版本3.2序列化问题
- 上一篇: 学做网站需要什么wordpress导航站模板
- 下一篇: 学做网站要多久多少钱ui动效网站
相关文章
-
学做网站需要什么wordpress导航站模板
学做网站需要什么wordpress导航站模板
- 技术栈
- 2026年03月21日
-
学做网站需要多久时间快速做网站公司哪家专业
学做网站需要多久时间快速做网站公司哪家专业
- 技术栈
- 2026年03月21日
-
学做网站如何创业一般制作一个网站要多久
学做网站如何创业一般制作一个网站要多久
- 技术栈
- 2026年03月21日
-
学做网站要多久多少钱ui动效网站
学做网站要多久多少钱ui动效网站
- 技术栈
- 2026年03月21日
-
学做网站要多少钱wordpress内涵段子
学做网站要多少钱wordpress内涵段子
- 技术栈
- 2026年03月21日
-
学做网站用什么服务器企业网站内容管理
学做网站用什么服务器企业网站内容管理
- 技术栈
- 2026年03月21日
