我正在尝试使用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);
为什么会出现这种情况?
答案 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
添加新字段。