1

我正在尝试编写RPCwith Thrift,客户端似乎与服务器通信得很好,并且服务器创建了一个列表以返回给客户端(正确的格式)。但是当我收到此错误时,客户端以某种方式无法识别数据包:

org.apache.thrift.TApplicationException:getEntityByIP 失败:未知结果

这是我的旧文件的样子:

struct EntityLookupMessage{
1: list<i32> entityIDs;
}
service EntityJoinService {
   list<i32> getEntityByIP(1:string IPval,2:i32 date);  
}

ServerImpl 是以下方法:

public List<Integer> getEntityByIP(String IPval, int date) throws TException {
    try{
        System.out.println("Checking..."+IPval);
        List<Integer> response=EntityJoinStandalone.getEntityByIP(entityLookup,IPval, date);
        System.out.println(response);
        return response;
    }finally{
        // TODO Auto-generated method stub
    return null
    }

由客户调用,如下所示:

List<Integer> entity = client.getEntityByIP(IPval, date); 

任何想法为什么会这样?

4

1 回答 1

3

原因

节俭的设计不允许空结果。这是生成的 recv_Xxx() 函数的代码:

public List<Integer> recv_getEntityByIP() throws org.apache.thrift.TException
{
  getEntityByIP_result result = new getEntityByIP_result();
  receiveBase(result, "getEntityByIP");
  if (result.isSetSuccess()) {
    return result.success;
  }
  throw new org.apache.thrift.TApplicationException(  
        org.apache.thrift.TApplicationException.MISSING_RESULT, 
        "getEntityByIP failed: unknown result");
}

您必须返回一个有效的结果,即...

  • 一个有效的列表,可以是空的,但不能是null
  • 服务器上抛出的异常

解决方案

return null从您的finally条款中删除。

最佳实践

将结果放入一个对象中,类似于您对 args 所做的操作:

struct EntityByIP_result {
  1: list<i32> data;
}

这样,您还可以为以后的进一步改进留出空间,您可以随时向其中添加新字段struct

于 2014-03-14T19:16:55.290 回答