apache / dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.
https://dubbo.apache.org/
Apache License 2.0
40.48k stars 26.43k forks source link

How can i throw a exception on server side when using rest and it can be recognized as a business exception by dubbo. #1214

Closed comdeng closed 6 years ago

comdeng commented 6 years ago

我们目前服务端使用了java和php混合开发,通过dubbo来做服务治理。java调用php接口时,基于rest协议连接。目前遇到的一个问题是,php抛异常的时候不知道如何被java认定为是业务异常,而不是invoke异常。 我们写了一些测试代码,通过java实现的rest协议的服务抛出异常来探索规律,目前了解到的是,http状态码应该符合如下规则: HTTP/1.1 500 java.lang.Exception:: error code 但是在php实现的接口里按照这样抛异常的话,java那边还是认为是invoke失败,而不是将其认定为业务类的异常。

请问,正确的抛业务异常的方式应该是怎样的呢?

zuohl commented 6 years ago

http接口用错误码来判断吧,即使要抛出异常也要在拦截器里转换异常为错误码,比如{ "code":"500","errMsg":"系统异常"}

chickenlj commented 6 years ago

I agree with what @zuohl suggests, i think you should catch business exceptions on server side and encode it like {"code":"500","errMsg":"xxx"}. This way, dubbo will pass the results to the initial caller, and you can handle it by yourself.

comdeng commented 6 years ago

好的。不过这样还是会有一些限制。 一般的情况还要定义一个字段用来接收数据,如果有业务代码异常,则将其返回null。 比如 {"code":"500","errMsg":"xxx","data":null}

这样定义DTO的时侯,就不能将data字段映射成数组等类型,否则遇到null的时候仍然会invoke失败。