thrift:返回null的解决办法

最的项目用到swift:thrift做RPC框架,开始也没有了解太深,就开始干了,今天开始测试了,发现thrift居然不允许服务接口返回null。跟踪源码到下面的方法,找到为null时抛出异常的位置:

Object com.facebook.swift.service.ThriftMethodHandler.readResponse(TProtocol in) throws Exception

readResponse方法片段:

        if (successCodec.getType() == ThriftType.VOID) {
            // TODO: check for non-null return from a void function?
            return null;
        }

        if (results == null) {
            throw new TApplicationException(TApplicationException.MISSING_RESULT, name + " failed: unknown result");
            // result为null抛出异常,异常错误代码:TApplicationException.MISSING_RESULT
        }

知道原因就好解决了,捕获TApplicationException异常判断就可以了:

    public List<Integer> loadAllPerson(){
        try{
            return service.loadAllPerson();
        }
        // 捕获RuntimeTApplicationException异常
        catch(RuntimeTApplicationException e){
            Throwable cause = e.getCause();
            // cause 类型为 TApplicationException时再判断异常类型时是否为MISSING_RESULT,
            // 是就返回null,否则继续向上抛出
            if (cause instanceof TApplicationException  
                && ((TApplicationException) cause).getType() == TApplicationException.MISSING_RESULT){
                return null;
            }
            throw e;
        }
        catch(net.gdface.facelog.client.thrift.ServiceRuntime e){
            throw new ServiceRuntime(e);
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

springboot2上报metrics到statsd

micrometer-registry-statsd-1.0.1-sources.jar!/io/micrometer/statsd/StatsdFlavor....

881
来自专栏林德熙的博客

dot net double 数组转 float 数组

本文告诉大家如果遇到 double 数组转 float 数组千万不要使用 Cast ,一般都使用 select 强转。

621
来自专栏Java Edge

遨游springmvc之HandlerExceptionResolver1.前言2.原理4.总结

3725
来自专栏xdecode

Guice之IOC教程

Guice 在上一篇博客中, 我们讲解了Spring中的IOC示例与实现, 本文着重介绍Guice注入以及与Spring中的差异. Guice是Google开发...

3429
来自专栏码匠的流水账

springboot2自定义statsd指标前缀

springboot2引入了micrometer,1.x版本的spring.metrics.export.statsd.prefix在2版本中已经被标记为废弃,...

742
来自专栏菩提树下的杨过

common-pool2 学习:thrift连接池的另一种实现

对象池是一种很实用的技术,经典的例子就是数据库连接池。去年曾经从零开始写过一个thrift客户端连接池。如果不想重造轮子,可以直接在apache开源项目comm...

2338
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第十二节 项目分层

3237
来自专栏吴小龙同學

Android Volley使用

导入Volley Volley貌似没有官方的Maven repository,你必须依赖官方的源代码。从它的repository 下载Volley源码。使用Gi...

3249
来自专栏面朝大海春暖花开

快递鸟电子面单打印功能基于java

快递鸟电子面单API地址:http://www.kdniao.com/api-eorder

621
来自专栏pangguoming

Android 子activity关闭 向父activity传值

使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会提供任何反馈。 可变通的,你可以启动一个Activity作...

3385

扫码关注云+社区