gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:42:47 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

您可以使用 Swift .

长话短说;注释您的类和接口(interface)(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));
}

本例中的 multiplex 实例变量是 libthrift.jar 中的 TMultiplexedProcessor 实例。

然后只需在您的 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

关于java - 可以从现有的 java/scala 接口(interface)和数据类型生成 .thrift 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25649288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com