如何在 Thrift 服务中使用特定于 java 的类型?

Posted

技术标签:

【中文标题】如何在 Thrift 服务中使用特定于 java 的类型?【英文标题】:How can I use java-specific types in Thrift service? 【发布时间】:2012-02-27 14:06:45 【问题描述】:

我正在编写一个 Thrift 服务,其基本功能是将所有查询代理到 EJB Bean。基本上,服务会收到一个调用,查找一个本地 bean,将查询转发给 bean,然后将答案转发回客户端。

主要问题是 thrift IDL 不支持特定于语言的类型。例如,方法参数之一是实现接口 Inamed 的对象(它扩展了 Serializable)。

如何告诉 thrift 我想从“my.package.interfaces.INamed”导入此接口并将其用作有效参数/返回类型?

【问题讨论】:

【参考方案1】:

如果你想通过 Thrift 发送任意对象,你可以将它们序列化并作为 Thrift 二进制数据发送,然后在另一端反序列化它们。不过这会绕过类型检查。

但是 Thrift 被设计为与语言无关,所以我认为您不能在 IDL 中表达特定于语言的类型。

你能定义一个匹配 INamed 的 Thrift 结构,然后在你的其他 Thrift 方法中使用它吗?

【讨论】:

我无法定义这个结构 - 我所知道的关于我收到的对象的所有信息是它具有接口 INamed,我对它的类一无所知,所以我不知道它包含的字段,所以我不能写一个结构。我了解语言独立性概念,但我希望 Thrift 允许更具体的语言机制,例如“void setName(1:javatype(my.package.interfaces.INamed) name)” 我认为我可以做的另一件事是使用 thrift 生成代码,然后修改 gen-code 以调整类型和导入等内容,但我觉得这不是正确的解决方案。

以上是关于如何在 Thrift 服务中使用特定于 java 的类型?的主要内容,如果未能解决你的问题,请参考以下文章

在全局(单例)服务中使用特定于请求的上下文

如何在 Flutter 中为 Web 编写特定于平台的代码?

如何使用 java-ee8、microProfile 4.0、Openliberty 21 和 Docker 设置特定于阶段的微配置文件配置

是否可以在 Java 中使用特定于平台的跨平台 sdk 方法?

为什么java.lang.NoSuchMethodError非常特定于环境或类加载器? [重复]

使用 GitHub Actions 在 .net 应用程序中填充特定于环境的变量