Thrift:在列表定义中使用外部java类

时间:2014-03-26 16:04:21

标签: java thrift thrift-protocol

我是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)
}

我有一组独立的Java文件在javaObject包中,而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);
    }
}

1 个答案:

答案 0 :(得分:0)

简短回答:你不能

所有Thrift structs都应该是生成代码。对于某些语言,创建了部分类(例如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类,反之亦然。

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