永发信息网

后端自定义的异常 在dubbo 怎么抛到前端

答案:3  悬赏:0  手机版
解决时间 2021-11-09 11:26
后端自定义的异常 在dubbo 怎么抛到前端
最佳答案
1)前端开发人员:精通JS,能熟练应用JQuery,懂CSS,能熟练运用这些知识,进行交互效果的开发。

2)后端开发人员:会写Java代码,会写SQL语句,能做简单的数据库设计,会Spring和iBatis,懂一些设计模式等。

现在来看,我们对前后端的要求还是蛮低的,尤其是后端,新员工经过培训之后都是可以参与到后端开发的,没有太高的技术门槛,唯一需要做的就是先变成熟练工种,这个阶段没有涉及到设计模式、架构、效率等一些列问题。
全部回答
用main吧,后台接口写成rest接口,前端用nodejs去调就可以了。提供provider.java包含main方法启动项目。
public Result invoke(Invoker invoker, Invocation invocation) throws RpcException {
try {
Result result = invoker.invoke(invocation);
if (result.hasException() && GenericService.class != invoker.getInterface()) {
try {
Throwable exception = result.getException();

// 如果是checked异常,直接抛出
if (! (exception instanceof RuntimeException) && (exception instanceof Exception)) {
return result;
}
// 在方法签名上有声明,直接抛出
try {
Method method = invoker.getInterface().getMethod(invocation.getMethodName(), invocation.getParameterTypes());
Class[] exceptionClassses = method.getExceptionTypes();
for (Class exceptionClass : exceptionClassses) {
if (exception.getClass().equals(exceptionClass)) {
return result;
}
}
} catch (NoSuchMethodException e) {
return result;
}

// 未在方法签名上定义的异常,在服务器端打印ERROR日志
logger.error("Got unchecked and undeclared exception which called by " + RpcContext.getContext().getRemoteHost()
+ ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()
+ ", exception: " + exception.getClass().getName() + ": " + exception.getMessage(), exception);

// 异常类和接口类在同一jar包里,直接抛出
String serviceFile = ReflectUtils.getCodeBase(invoker.getInterface());
String exceptionFile = ReflectUtils.getCodeBase(exception.getClass());
if (serviceFile == null || exceptionFile == null || serviceFile.equals(exceptionFile)){
return result;
}
// 是JDK自带的异常,直接抛出
String className = exception.getClass().getName();
if (className.startsWith("java.") || className.startsWith("javax.")) {
return result;
}
// 是Dubbo本身的异常,直接抛出
if (exception instanceof RpcException) {
return result;
}

// 否则,包装成RuntimeException抛给客户端
return new RpcResult(new RuntimeException(StringUtils.toString(exception)));
} catch (Throwable e) {
logger.warn("Fail to ExceptionFilter when called by " + RpcContext.getContext().getRemoteHost()
+ ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()
+ ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e);
return result;
}
}
return result;
} catch (RuntimeException e) {
logger.error("Got unchecked and undeclared exception which called by " + RpcContext.getContext().getRemoteHost()
+ ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()
+ ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e);
throw e;
}
}
所以在dubbo的service端想抛出自定义异常,只能通过在service端的接口方法上声明所要抛出的异常,或者将异常类与接口同包,再或者是接口的实现类再实现dubbo的GenericService接口。
对于第一种方案没有使用,因为它对代码的入侵比较严重。
第二种方案可以实现,可对于目前的业务框架,让接口类和异常类同包则变得不太可能。
所以最后选择了让接口实现类再实现GenericService接口,而对于其需要实现的$invoke方法则没有做任何的方法体处理,直接废弃。

对于dubbo的service端自定义异常类的处理,有些不理解的就是,为什么dubbo需要对自定义异常类做一次Runtime异常的转化,而不是直接抛出原异常类型。或者有没有对dubbo更了解的朋友,有对自定义异常更好的处理方法。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
求华侨城王晓雯董事的详细资料?
关于五十的成语
五家渠市102团邮政支局办公地址在什么地方,
玉化砗磲手串什么价
あにき怎么读
芳和明比赛踢毽子,35秒小芳踢了45个,小明踢
全天下的女人都请不要问为什么护肤品那么贵
藤仓光纤熔接机61s和62s有什么区别
从2001到20161月个人交社保己15年现已办理退
中国神舟四号飞船的资料?
7堡什么饭好吃?
如何辨别鸡蛋是否受精
亲人的遗照可以保留吗妻子的哥哥去世后,妻子
河北理科2017高考分450能上什么学校
衡阳市有没有加工食品的厂子?冒味一问。
推荐资讯
大发·宜景城三期周边环境怎么样?生活便利吗
pzoz女装怎么样,它家的衣服质量如何?
电动车电池可以两组并联在一起使用吗?
这个女的怎么样??在学校是 j~ i吗??
Word中自动生成的目录页码带“-1-”,如何变
为什么不是给她男人100%加气
盆栽绿竹放卧室可以吗
求初音的这个套图
197减去九十几等于九十几
喜洋副食品地址在什么地方,想过去办事
佛教由什么传入中国
青山对绿水,和风对细雨,山高对什么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?