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

use*_*956 4 java scala thrift thrift-protocol

是否有一种简单的方法来获取现有的Java/scala数据类型和API接口并生成相应的.thrift文件?Thrift生成服务器数据结构是过度侵入的,因为它会产生后果:

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

其结果是,它似乎是节俭的力量本身将其用于我的服务器专属持久格式 - 除非,那就是,我创建一个围绕节俭或与这些数据结构处理(休眠其他我的坚持格式数据编组包装,杰克逊,斯卡拉BeanProperty,...).然而,这违背了自动数据编组工具如节俭的目的,并且直接导致具有保持相同,但是,单独的接口和数据结构(的天才的工程师时间和精力=废物)的容易出错的世界.

我对Thrift自动生成客户端代码非常满意.但是,我(强烈)认为我需要自由编辑我的服务器在API中处理的数据结构.

BCG*_*BCG 5

你可以使用Swift.

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

一旦做到这一点,以创建一个TProcessor,你可以在一个TServlet正常TProtocol/TTransport对象使用,做这样的事情在你的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));
}
Run Code Online (Sandbox Code Playgroud)

此示例中的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

另外......斯威夫特强迫你的结构被标记final...... JPA规范说实体不能final......似乎无论如何都可以使用Eclipselink但是YMMV