You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Guo (JIRA)" <ji...@apache.org> on 2016/04/05 09:44:25 UTC

[jira] [Created] (THRIFT-3778) go client can not pass method parameter to server of other language

Guo created THRIFT-3778:
---------------------------

             Summary: go client can not pass method parameter to server of other language
                 Key: THRIFT-3778
                 URL: https://issues.apache.org/jira/browse/THRIFT-3778
             Project: Thrift
          Issue Type: Bug
          Components: Go - Compiler
    Affects Versions: 0.9.3
            Reporter: Guo


go client can not pass method parameter to java server

for example message.thrift
{code:title=message.thrift|borderStyle=solid}
namespace java test
namespace csharp test
namespace go test
struct Message
{
    1: string text
}
service MessageProcessor {
    void process(Message message);
}
{code}
We generated messageprocess.go as golang client and MessageProcessor.java as java server
When go client send service method arguments "process_args", 1 is sent as the field_id of struct "message"
{code:title=messageprocessor.go|borderStyle=solid}
func (p *MessageProcessorProcessArgs) Write(oprot thrift.TProtocol) error {
  if err := oprot.WriteStructBegin("process_args"); err != nil {
    return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err)
  }
  if err := p.writeField_1(oprot); err != nil {
    return err
  }
  ...
}

func (p *MessageProcessorProcessArgs) writeField_1(oprot thrift.TProtocol) (err error) {
  if err := oprot.WriteFieldBegin("message", thrift.STRUCT, 1); err != nil {
    return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:message: ", p), err)
  }
  ...
}
{code}
When java server try to receive service method arguments "process_args", -1 is marked as the field_id of struct "message"
{code:title=MessageProcessor.java|borderStyle=solid}
  private static class process_argsStandardScheme extends StandardScheme<process_args> {
  ...
  iprot.readStructBegin();
  while (true)
  {
    schemeField = iprot.readFieldBegin();
    if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
      break;
    }
    switch (schemeField.id) {
      case -1: // MESSAGE
      if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
        struct.message = new Message();
        struct.message.read(iprot);
        struct.setMessageIsSet(true);
      } else { 
        org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
      }
      break;
      default:
        org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
    }
    iprot.readFieldEnd();
  }
  iprot.readStructEnd();
  ...
{code}

Because of this, we always receive NULL "message" in java server.
Compared to some other language implementation, I think it's a thrift go generator problem.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)