可以从现有的 java/scala 接口和数据类型生成 .thrift 文件吗?

2023-12-02

有没有一种简单的方法可以采用现有的 Java/scala 数据类型和 API 接口并生成相应的 .thrift 文件?让 Thrift 生成server数据结构具有过度侵入性,因为它会产生以下后果:

  • 我无法注释我的数据结构(例如 XML、JSON、hibernate 持久性......)
  • 此模式与想要拥有或需要修改我的源文件的其他序列化框架冲突。

因此,thrift 似乎迫使自己成为我的服务器的专有持久化格式——除非,也就是说,我围绕 Thrift 或其他处理这些数据结构的持久化格式创建一个数据编组包装器(hibernate、hibernate、杰克逊,scala BeanProperty,...)。然而,这违背了 thrift 等自动化数据编组工具的目的,并直接导致必须维护相同但独立的接口和数据结构的容易出错的世界(=浪费才华横溢的工程师的时间和精力)。

我对 Thrift 自动生成客户端代码非常满意。然而,我(强烈)觉得我需要自由地编辑我的服务器在 API 中处理的数据结构。


您可以使用Swift.

使长话短说;注释您的类和接口(Thrift 术语中的结构和服务)。然后,您可以运行 Swift 的客户端/服务器代码,也可以使用 swift2thrift 生成器生成等效的 IDL 并使用 Thrift 编译器生成客户端(后者是我针对您所描述的内容推荐的)。

一旦创建了一个 TProcessor,您可以在带有普通 TProtocol/TTransport 对象的 TServlet 中使用它,请在 servlet 的 init() 中执行类似的操作:

protected void addProcessor(String name, Object svc) {
    ThriftCodecManager codecManager = new ThriftCodecManager(
        new CompilerThriftCodecFactory(false)
    );
    List<ThriftEventHandler> eventList = Collections.emptyList();
    ThriftServiceProcessor proc = new ThriftServiceProcessor(codecManager, eventList, svc);
    this.processors.put(name, proc);
    this.multiplex.registerProcessor(name, NiftyProcessorAdapters.processorToTProcessor(proc));
}

本例中的 Multiplex 实例变量是TMultiplexedProcessor from libthrift.jar.

然后只需在 doPost() 中执行此操作:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    getServletContext().log("entering doPost()");
    TTransport inTransport = null;
    TTransport outTransport = null;
    try {

        InputStream in = request.getInputStream();
        OutputStream out = response.getOutputStream();

        TTransport transport = new TIOStreamTransport(in, out);
        inTransport = transport;
        outTransport = transport;

        TProtocol inProtocol = getInProtocolFactory().getProtocol(inTransport);
        TProtocol outProtocol = getOutProtocolFactory().getProtocol(outTransport);

        if (multiplex.process(inProtocol, outProtocol)) {
            out.flush();
        } else {
            throw new ServletException("multiplex.process() returned false");
        }
    } catch (TException te) {
        throw new ServletException(te);
    } finally {
        if (inTransport != null) {
            inTransport.close();
        }
        if (outTransport != null) {
            outTransport.close();
        }
    }
}

仅供参考 - TJSONProtocol 不适用于 0.14 版之前的 Swift 版本,因此此时如果您需要使用它,则需要从源代码构建。

另外... Swift 强制你的结构被标记final... JPA 规范规定实体不能final...无论如何,似乎可以与 Eclipselink 一起使用,但是 YMMV

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以从现有的 java/scala 接口和数据类型生成 .thrift 文件吗? 的相关文章

随机推荐

  • Laravel 5.6 Passport 驱动程序无法在 socket.io 中工作并给出未经授权的异常

    当驱动程序是 api 时 下面的代码可以完美运行 然后我创建了一个新项目并将驱动程序更改为护照 现在 我总是收到错误 未经授权 我可以确认请求标头在浏览器中具有授权令牌代码 请单击下面的图像进行检查 然后单击缩放以查看质量更好的图像 我在下
  • 规则集中的字体和行高顺序

    我认为规则集中 CSS 的顺序并不重要 只要不存在隐式重复的规则 例如border and border top 事实上 许多 CSS 样式指南建议采用任意顺序 例如 按组 或 按字母顺序 然而 顺序font and line height
  • NSURLConnection 在 GET 上提前关闭

    我正在研究一种集中 URL 连接的方法 用于从服务器发送和接收 JSON 数据 它适用于 POST 但不适用于 GET 我正在使用 Google App Engine 服务器 在我的计算机上它将处理 POST 请求并返回正确的结果 并正确记
  • Jetty:Servlet 无法转发到 JSP

    我遇到以下问题 我尝试将请求从 servlet 转发到 jsp 页面 但收到 404 当我直接访问 sites home jsp 时 它会加载 jsp WebAppContext sites new WebAppContext src co
  • java可执行jar创建

    如何从 java 文件创建可执行 jar 文件 只有一个使用awt和applet创建的java文件dm java 我需要创建带有图标或图像的可执行 jar 单击该 jar 它将作为应用程序打开 这是可能的 请帮我 Using Eclipse
  • 从字符串中提取 URL

    我正在尝试找到一个可靠的解决方案来从字符串中提取网址 我有一个网站 用户可以在其中回答问题 并在来源框中输入信息来源 我允许他们输入网址 我想提取该网址并将其设为超链接 类似于雅虎问答的做法 有谁知道可以做到这一点的可靠解决方案 我发现的所
  • 预编译头在使用 Qt Creator / qmake / MinGw 的调试构建中不起作用

    在 Qt Creator 中 我有一个使用预编译标头的 pro 文件 当我在发布模式下构建时 构建工作非常完美 但是在调试模式下构建会出现错误 生成目标文件失败 例子 17 12 40 Running steps for project E
  • 在 AngularJS 中,HTML 模板中包含的任何内联 javascript 代码都不起作用

    在 AngularJS 中 HTML 模板中包含的任何内联 JavaScript 代码都不起作用 例如 main html 文件 div div 和 script html 文件 当我打开主页时 我期待一条警告消息说 是 但什么也没有发生
  • 在远程计算机上安装软件? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 这看起来像是一个垃圾问题 但我对 VbScript 的完全无知让我没有机会尝试解
  • Python sqlite3 和并发

    我有一个使用 线程 模块的Python 程序 每秒 我的程序都会启动一个新线程 从网络上获取一些数据 并将这些数据存储到我的硬盘上 我想使用 sqlite3 来存储这些结果 但我无法让它工作 问题似乎与以下行有关 conn sqlite3
  • jQuery MultiSelect dropdownlist 如何访问结果?

    如何从按 mvc3 razor 调用的 JQUery 多选下拉列表中获取结果 http abeautifulsite net blog 2008 04 jquery multiselect 多选插件使用 符号将选定的值发送到服务器 一如既往
  • 如何在 C# 中加载程序图标

    我有某个程序的路径 例如explorer 如何获取程序图标 将其转换为png jpeg 然后显示在PictureBox中 我有这样的事情 string filePath C myfile exe Icon TheIcon IconFromF
  • SQL转置数据

    我有一个名为 Forecast 的表 如下所示 Product BK 有大约 80 000 条记录 而 Month 有 12 条记录 States 保持不变 为 5 条 如何编写查询将数据转置为如下所示 这是在 SQL 服务器上 并且不喜欢
  • 数组除法 - 将数组中存储的两个数字相除的最佳方法是什么?

    我有两个数组 被除数 除数 dividend 1 2 0 9 8 7 5 6 6 divisor 9 8 我需要的结果 股息 除数 为 quotient 1 2 3 4 5 6 7 我使用数组减法做到了这一点 从被除数中减去除数 直到被除数
  • C# WebClient - DownloadString 编码错误

    我正在尝试从 Amazon 下载 html 文档 但由于某种原因 我得到了一个错误的编码字符串 例如 K g g e 这是我尝试过的代码 using var webClient new System Net WebClient var ur
  • 如何重塑和交错矩阵元素?

    有了时间序列的值 我想将其重塑为 nx4 矩阵 X y 以便使用这些值作为机器学习算法的输入和输出值 X i 是 1x3 输入向量 y 是输出标量值 该算法将每个第二个序列值 3 个值 作为输入 以便预测第四个值 举一个实际的例子 假设我们
  • 如何在 vscode 中查看全角代码

    我想在 VS Code 中编码时使用完整视口 但是当我展开 VS Code 窗口时 这些行并没有扩展 有修复吗 使用的正确配置 为了配置 V S 代码使得代码行在 你的编辑器只会在视口的末尾换行 并且 以前从未如此 您需要将正确的值分配给
  • 如何在使用 playwright-python 运行代码结束时保持浏览器打开?

    我想使用 playwright python 自动填写一些表格 然后在提交之前仔细检查填写内容 但它总是在代码运行结束时关闭浏览器 即使我使用了handleSIGHUP False handleSIGINT False handleSIGT
  • Espresso 测试被后台线程阻止。应用程序不空闲异常:“AppNotIdleException。”

    我的 android espresso 单元测试由于某些后台线程不空闲而被阻止 我如何找出哪个线程正在阻止我的应用程序执行 android support test espresso AppNotIdleException Looped f
  • 可以从现有的 java/scala 接口和数据类型生成 .thrift 文件吗?

    有没有一种简单的方法可以采用现有的 Java scala 数据类型和 API 接口并生成相应的 thrift 文件 让 Thrift 生成server数据结构具有过度侵入性 因为它会产生以下后果 我无法注释我的数据结构 例如 XML JSO