使用Thrift with Java,org.apache.thrift.TApplicationException未知结果

时间:2014-03-14 19:03:16

标签: java rpc thrift thrift-protocol

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

  

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

这就是我的thrift文件的样子:

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); 

为什么会出现这种情况?

1 个答案:

答案 0 :(得分: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添加新字段。