thrift:返回null的解决办法

本文介绍使用Swift:Thrift作为RPC框架时遇到的问题及解决办法。详细讲述了当服务接口返回null时thrift的异常处理机制,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最的项目用到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);
        }
    }
### JSP 页面运行时出现 500 错误的可能原因及解决方案 #### 可能原因分析 1. **Order 对象未正确定义或初始化** 如果在 JSP 中使用了一个名为 `Order` 的对象,而该对象并未被正确传递到视图层,则可能导致 NullPointerException 或其他异常。例如,在控制器中未通过模型将数据传入 JSP 文件[^1]。 2. **application 属性使用不当** 在 JSP 中,`application` 是内置的一个隐式对象,代表 ServletContext 实例。如果尝试访问不存在的属性或者调用了不支持的方法,可能会引发错误。例如,试图获取一个尚未设置的全局范围变量会返回 null 并抛出异常[^1]。 3. **依赖库缺失** 类似于 Hive 远程连接中的 NoClassDefFoundError 和 ClassNotFoundException 报错情况[^2],当项目缺少必要的类文件(比如 Apache Thrift 库),同样会在加载阶段失败并触发 HTTP 500 响应码。 4. **路径配置问题** 若资源定位有误——无论是静态文件还是动态请求映射地址不对劲都会造成服务器内部处理失误从而反馈给客户端此状态码。 5. **语法逻辑错误** 编写过程中存在拼写上的疏忽亦或是业务流程设计不合理也会致使程序崩溃进而显示 Internal Server Error 提示信息。 #### 解决方案建议 针对上述提到的各种可能性提供相应的解决办法如下: - 验证所有自定义实体类如 Order 是否已被加入至 ModelMap 当前上下文中以便前端能够正常渲染展示其字段值;如果没有则需调整 Controller 方法使之包含相应参数赋值操作。 ```java model.addAttribute("order", new Order()); ``` - 审查对于 application scope 下各项键名的实际运用场景确认它们确实已经被赋予合适的初值再做进一步读取动作之前先判断是否存在以及类型匹配与否等情况。 ```jsp <% if(application.getAttribute("someKey") != null){ %> <!-- Safe to proceed --> <% }else{ %> <!-- Handle missing attribute case --> <%} %> ``` - 检查项目的 build path 设置确保所有的第三方 jar packages 已经下载安装完毕并且版本兼容无冲突现象发生特别注意那些涉及到网络通信协议栈实现的基础组件们比如说这里提及到 thrift 相关包体是否齐全有效。 ```xml <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.16.0</version><!-- Choose appropriate version based on requirements--> </dependency> ``` - 核实各个 URL 路由规则书写准确度避免因大小写字母差异或者是多余的斜杠字符引起解析歧义最终导向错误的目标位置上去查找对应的服务端处理器函数入口点找不到自然也就报错了嘛! - 细致梳理整个控制流环节逐一排查潜在的风险隐患点从输入验证一直到输出转换每一个步骤都不能放过直到彻底排除掉任何可疑因素为止最后记得开启调试模式观察日志记录来辅助诊断具体症结所在之处哦~ ```properties logging.level.org.springframework=DEBUG ``` ### 示例代码片段 以下是基于 Spring MVC 构建的一个简单例子演示如何向 JSP 传输数据并通过 EL 表达式安全地访问这些数据: ```java @Controller public class SampleController { @GetMapping("/sample") public String sample(Model model){ Order order = new Order(); order.setId(1L); order.setName("Sample Order"); model.addAttribute("order", order); // Add object into the model return "sample_page"; } } ``` 对应的 JSP 文件 (`sample_page.jsp`) 如下所示: ```jsp <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Sample Page</title> </head> <body> <h1>${not empty order ? 'Order Details:' : 'No Order Found'}</h1> <c:if test="${not empty order}"> <p>ID: ${order.id}</p> <p>Name: ${order.name}</p> </c:if> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值