java - 将 Thrift 与 Java 结合使用,org.apache.thrift.TApplicationException 未知结果

标签 java rpc thrift thrift-protocol

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

org.apache.thrift.TApplicationException: getEntityByIP failed: unknown result

这是我的 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); 

知道为什么会这样吗?

最佳答案

原因

Thrift 设计不允许出现空结果。这是生成的 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
  • 服务器抛出异常

解决方案

finally 子句中删除 return null

最佳实践

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

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

这样您也为以后的进一步改进留下了空间,您可以随时向 struct 添加新字段。

关于java - 将 Thrift 与 Java 结合使用,org.apache.thrift.TApplicationException 未知结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22413625/

相关文章:

java - rpm-maven-plugin 与 softlinkSorce 中的错误,不是吗?

java - 如何将 double 舍入到 n 长度(不是 n 小数位)?

java - 如何使用 Protocol Buffer RPC 调用通过 BigData 响应客户端?

c - SUN RPC(ONC/RPC): Calculating round trip time (or pinging) using null procedure in C

Java Pojo 类 -> ASN.1 for RPC

java - 从 Java Web 应用程序调用 ruby​​ 库

python - gevent,触发新生成的任务运行的方法

java - 在 Android 中,我试图在单个 Activity 中针对不同的方向调用 2 个 xml 布局

java - 使用 PDF 渲染器打开后无法删除 pdf 文件

C#源文件合并