1

我是 Thrift 的新手,非常感谢编写 Thrift 生成器文件的一些帮助。我想使用具有多种语言的许多客户端的 Java 服务器。我正在使用 Thrift 自动生成这些文件。

这是我的 Thrift 文件:

namespace php example
namespace py example
namespace csharp example
namespace cpp example
namespace perl example
namespace d example
namespace java javaobjectmethods

struct ExternalLibraryItem {
    1: required string name
}

service ExampleService {
    list<ExternalLibraryItem> javaObjectMethod(1:i32 count)
}

我在包 javaObject 中有一组单独的 Java 文件,而 javaObjectMethod 是包中的方法之一。但是,此方法返回一个由外部库实例化的对象。如何在没有以下内容的情况下将其写入 Thrift 文件:

struct ExternalLibraryItem {
    1: required string name
}

它目前不会让我在没有这一行的情况下生成服务器文件。

这是我的 Java 文件:

package javaobjectmethods;

import externalLibrary.ExternalLibaryItem;
import externalLibrary.ExternalLibraryClass;

public class javaObject {
    private String file;

    public javaObject(String file) {
        this.file = file;
    }

    public List<ExternalLibraryItem> javaObjectMethod(int count) {
        // this method returns List<ExternalLibraryItem>
        return ExternalLibraryClass.doThis(count, this.file);
    }
}
4

1 回答 1

0

简短的回答:你不能。

所有 Thriftstructs都应生成代码。对于某些语言,创建部分类(例如 C#)可以在这种情况下提供帮助,但并非对所有语言都有帮助。此外,在某些情况下(C++),基类可以在一定程度上进行定制。对于 Java,

struct Foo {
  1: i32 bar
}

导致一堂以

public class foo implements org.apache.thrift.TBase<foo, foo._Fields>, 
                            java.io.Serializable, 
                            Cloneable, 
                            Comparable<foo>

这是周围的代码和结构所需要和期望的。

对于您的特定情况,一种可能的解决方案是将内部类转换为 Thrift 类,反之亦然。

当然,如果您对如何更好地做到这一点有一个很酷的想法 - 我们愿意接受高质量的补丁。

于 2014-03-26T19:03:11.527 回答