当前位置: 首页 > 面试题库 >

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

晋安国
2023-03-14
问题内容

有没有简单的方法可以采用现有的Java / scala数据类型和API接口并生成相应的.thrift文件?使用Thrift生成 服务器
数据结构会过度侵入,因为它会导致以下后果:

  • 我无法注释我的数据结构(例如,用于XML,JSON,休眠持久性等)
  • 这种模式与其他想要拥有或需要修改我的源文件的序列化框架相冲突。

结果,它看起来像是节俭,迫使自己成为服务器的专有持久性格式,除非,也就是说,我围绕Thrift或其他处理这些数据结构的持久性格式创建了一个数据编组包装器(休眠,
Jackson,scala
BeanProperty,…)。但是,这违背了诸如节俭之类的自动化数据编组工具的目的,并直接导致易于出错的世界,即必须维护相同但分开的接口和数据结构(=浪费了有才华的工程师时间和精力)。

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


问题答案:

您可以使用Swift。

使长话短说;
注释您的类和接口(用Thrift的话来说就是结构和服务)。然后,您可以运行Swift的客户端/服务器代码,也可以使用swift2thrift生成器生成等效的IDL,并使用Thrift编译器生成客户端(后者是我建议的描述对象)。

一旦完成创建可在TServlet中与常规TProtocol /
TTransport对象一起使用的TProcessor的操作,请在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实例变量是TMultiplexedProcessorfrom 的实例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版本,因此如果您需要使用TJSONProtocol,则需要从源代码进行构建。

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



 类似资料:
  • 问题内容: 我正在学习Scala,并好奇是否有可能: 创建一个在Scala中实现Java接口的对象 将对象编译成类文件并将其打包 使用Java中的对象 我想在Scala中实现自定义Lucene查询解析器,并能够让其他人从Java应用程序访问它。 问题答案: 我假设“对象”实际上是“类”。无论如何,答案是肯定的,您可以这样做。如果您希望所有这些都在同一项目中,则需要利用Scala / Java联合编

  • 本文向大家介绍PHP生成json和xml类型接口数据格式,包括了PHP生成json和xml类型接口数据格式的使用技巧和注意事项,需要的朋友参考一下 php生成接口通信数据 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 将Android Studio升级到4.0版本后,在“gradle-wrapper.properties”中:

  • 关于数据类型,我坚持节俭。 现在,当我将整数值映射到节俭生成的bean时,我在idl定义中使用i32类型。 问题是,在TMyBean生成的bean中,i var是一个int基元类型,它将0作为默认值,而对我来说,0是一个有效值。 我尝试将可选关键字放在idl文件中,但事情没有改变,它总是int。 我该如何处理这种情况?我需要在TMyBean i var中接受null值。 谢谢你,费德拉。。

  • 我想使用 Enarticulateciate 自动生成我的 REST API 的文档。 JAX-RS注释代码如下: < code>IAuthentication是一个接口,它必须保持不变。这是因为我使用了注入,我无法预测方法< code>authenticate()返回的确切类型。然而,< code>CLogin是一个类,这是可以的,因为它是方法< code>authenticate()接受的类型

  • 当我继续我的在线教程,我遇到了这一课。我有一个接口和两个实现该接口的类。 null 这是因为所有的类都实现了接口Payve[]吗? 如果接口是在顶层层次结构中定义的,那么是否总是可以创建实现该接口的所有类的对象?