Экономия: использование внешнего Java-класса в определении списка

Я новичок в 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 ответ

Решение

Краткий ответ: вы не можете.

Все бережливость 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 и наоборот.

Конечно, если у вас есть отличная идея, как сделать это лучше - мы открыты для качественных патчей.

Другие вопросы по тегам