marsmay opened a new issue #284:
URL: https://github.com/apache/dubbo-go-hessian2/issues/284


   dubbo-go-hessian2 版本 v1.9.4-0.20210917102639-74a8ece5f3cb;
   
   项目主技术栈 java,dubbo 接口统一返回范型定义 com.xxx.common.Result:
   
   ```java
   public class Result <T> implements java.io.Serializable {
       private java.lang.String code;
       private java.lang.String message;
       private T data;
   }
   ```
   
   ```java
   public interface MerchantFacade {
     Result<[]Merchant> List(String lang, Long page);
     Result<Merchant> Detail(Long merchantId, String lang, Long page);
   }
   ```
   
   golang 作为 provider 时,如下方式可正常工作:
   
   ```golang
   type Merchant struct {
       //商户ID
       Id int64
   
       //商户名称
       Name string
   }
   
   func (Merchant) JavaClassName() string {
       return "com.xxx.common.app.voucher.provider.dto.Merchant"
   }
   
   type MerchantResponse struct {
       Code    string
       Message string
       Data    *Merchant
   }
   
   func (MerchantResponse) JavaClassName() string {
       return "com.xxx.common.Result"
   }
   
   type MerchantListResponse struct {
       Code    string
       Message string
       Data    []*Merchant
   }
   
   func (MerchantListResponse) JavaClassName() string {
       return "com.xxx.common.Result"
   }
   
   func init() {
       hessian.RegisterPOJO(&Merchant{})
       hessian.RegisterPOJO(&MerchantResponse{})
       hessian.RegisterPOJO(&MerchantListResponse{})
   }
   ```
   
   ```golang
   type MerchantProvider struct{}
   
   func (p *MerchantProvider) Reference() string {
       return "MerchantProvider"
   }
   
   func (p *MerchantProvider) List(ctx context.Context, lang string, page 
int64) (rsp *protocol.MerchantListResponse, err error) {
       ...
   }
   
   func (p *MerchantProvider) Detail(ctx context.Context, merchantId int64, 
lang string, page int64) (rsp *protocol.MerchantResponse, err error) {
       ...
   }
   
   var Merchant = &MerchantProvider{}
   
   func init() {
       config.SetProviderService(Merchant)
   }
   ```
   
   java 作为 consumer 可正常调用和解析数据;
   当 golang 作为 consumer 时,为了方便解析返回数据,定义了一个范型结构体:
   
   ```golang
   type Result struct {
       Code    string
       Message string
       Data    interface{}
   }
   
   func (Result) JavaClassName() string {
       return "com.xxx.common.Result"
   }
   
   func init() {
       hessian.RegisterPOJO(&Result{})
   }
   ```
   
   目前 golang 同时启动 provider 和 consumer 后,golang consumer 可以正常调用 java provider 
并解析数据;
   但 java consumer 调用 golang provider 会数据解析报错;
   
   尝试将将 golang provider 的返回数据类型更换成 Result 范型,java consumer 依然无法解析;
   目前解决方案是 golang provider 返回使用非范型的结构,每个接口定义不同 JavaClassName 的 response,修改后   
java consumer 调用正常,golang consumer 调用范型返返回的  java provider 也正常;
   
   期望 golang provider 的接口返回值为范型 Result 时,java consumer 可以正常调用并解析应答;


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to