Thrift で null を返すには?

Thrift では C++との相互運用の都合で RPC の応答に null を返すことができない模様。(呼ばれた側で return null; ができない)*1

厳密には return null; できるわけですが、その場合クライアント側で

TApplicationException: getFoo failed: unknown result
        at foo.FooService$Client.recv_getFoo(FooService.java:76)
        at foo.FooService$Client.getFoo(FooService.java:44)
        at TestClient.main(TestClient.java:38)

といった例外が出る。

逃げ道としては、次の3択

  • 返り値を struct にして、有効無効フラグと合わせて返す。フラグを見て無効な場合は null が返ったと判断する。
  • 相互運用性を捨ててパッチを当てる
  • 決定的な解決方法を Thrift 開発陣に suggest する

struct 使ってメッセージを太らせたくない。どーしてもnullを帰したい。という場合のパッチは Client クラス の recv_XXXX というメソッド内で返り値のチェックしている部分を無効にすればOK。

こんなかんじ。

//      if (result.isSetSuccess()) {
         return result. success ;
//      }
//      throw new TApplicationException(TApplicationException.MISSING_RESULT, "hello failed: unknown result");

こうしたときに他の言語でどうなるかは試していないので不明。バッドノウハウということで。

IDLに nullable string hoge(1:string arg) と書けたらいいのに…で、C++コードをgenするときにエラーすると。。C++の人に怒られそうだけど。

*1:[Thrift] Services can't return null? http://publists.facebook.com/pipermail/thrift/2007-September/000084.html 2007年と情報が古いので解決されてるかも