AutoProtoSchemaBuilder не создает прото-файл - PullRequest
0 голосов
/ 27 мая 2020

Обновил мой код в соответствии с предложением @Ryan Emerson, но я все еще не вижу автоматического создания файла Impl и файла proto

@AutoProtoSchemaBuilder(
        includeClasses = { Book.class,  Author.class },
        schemaFileName = "library.proto",
        schemaFilePath = "proto/")
        interface DummyInitializer extends SerializationContextInitializer {


}

Author.class

public class Author {
    private final String name;
    private final String surname;

    @ProtoFactory
    public Author(String name, String surname) {
        this.name = (String)Objects.requireNonNull(name);
        this.surname = (String)Objects.requireNonNull(surname);
    }

    @ProtoField(
        number = 1
    )
    public String getName() {
        return this.name;
    }

    @ProtoField(
        number = 2
    )
    public String getSurname() {
        return this.surname;
    }

    public boolean equals(Object o) {
        if (this == o) {
            return true;
        } else if (o != null && this.getClass() == o.getClass()) {
            Author author = (Author)o;
            return this.name.equals(author.name) && this.surname.equals(author.surname);
        } else {
            return false;
        }
    }

    public int hashCode() {
        return Objects.hash(new Object[]{this.name, this.surname});
    }
}

Book.class

public class Book {
    private final String title;
    private final String description;
    private final int publicationYear;
    private final Set<Author> authors;

    @ProtoFactory
    public Book(String title, String description, int publicationYear, Set<Author> authors) {
        this.title = (String)Objects.requireNonNull(title);
        this.description = (String)Objects.requireNonNull(description);
        this.publicationYear = publicationYear;
        this.authors = (Set)Objects.requireNonNull(authors);
    }

    @ProtoField(
        number = 1
    )
    public String getTitle() {
        return this.title;
    }

    @ProtoField(
        number = 2
    )
    public String getDescription() {
        return this.description;
    }

    @ProtoField(
        number = 3,
        defaultValue = "-1"
    )
    public int getPublicationYear() {
        return this.publicationYear;
    }

    @ProtoField(
        number = 4
    )
    public Set<Author> getAuthors() {
        return this.authors;
    }

    public boolean equals(Object o) {
        if (this == o) {
            return true;
        } else if (o != null && this.getClass() == o.getClass()) {
            Book book = (Book)o;
            return this.publicationYear == book.publicationYear && this.title.equals(book.title) && this.description.equals(book.description) && this.authors.equals(book.authors);
        } else {
            return false;
        }
    }

    public int hashCode() {
        return Objects.hash(new Object[]{this.title, this.description, this.publicationYear, this.authors});
    }
}

класс context-initialzer с замещающими методами

import org.infinispan.protostream.SerializationContext;

import java.io.UncheckedIOException;

public class contextInitializer implements DummyInitializer {
    @Override
    public String getProtoFileName() {
        return null;
    }

    @Override
    public String getProtoFile() throws UncheckedIOException {
        return null;
    }

    @Override
    public void registerSchema(SerializationContext serCtx) {

    }

    @Override
    public void registerMarshallers(SerializationContext serCtx) {

    }
}

Затем ClassA, который создает экземпляр context-initializer

public class classA {


  DummyInitializer myInterface= new contextInitializer();



    //Create a new cache instance


    public void startCache() {
        {

          try {
            manager = new DefaultCacheManager("src/main/resources/infinispan.xml");
            GlobalConfigurationBuilder builder= new GlobalConfigurationBuilder();
            builder.serialization().addContextInitializers(myInterface);
            System.out.println("------------------>"+ builder.serialization().addContextInitializers(myInterface));
            cache = manager.getCache();
            System.out.println(cache.getName()+" is initialized ");
          } catch (IOException e) {
            throw new IllegalArgumentException("Failed to initialize cache due to IO error",e);
          }
        }

        }

Maven

                <dependency>
                <groupId>org.infinispan</groupId>
                <artifactId>infinispan-bom</artifactId>
                <version>${infinispan.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.infinispan.protostream</groupId>
                <artifactId>protostream-processor</artifactId>
                <scope>provided</scope>
            </dependency>

Я по-прежнему не вижу ни одного автоматически сгенерированного файла proto. Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Вам также необходимо добавить артефакт org.infinispan.protostream:protostream-processor в качестве зависимости, чтобы код был сгенерирован:

<dependency>
    <groupId>org.infinispan.protostream</groupId>
    <artifactId>protostream-processor</artifactId>
    <version>4.3.2.Final</version>
</dependency>

Как только он появится, будет сгенерирован класс DummyInitializerImpl. java, который автоматически регистрирует файл proto и маршаллеры для классов Book и Author. Помните, что эти классы также должны иметь аннотации протопотока для генерации схемы и маршаллеров. Примеры кода см. В документации .

Есть две проблемы с вашим текущим кодом:

  1. Вы предоставили класс DummyInitializerImpl, но это что должно быть сгенерировано @AutoProtoSchemaBuilder.
  2. В вашем DummyInitializerImpl вы пытаетесь зарегистрировать Infinispan UUIDMarshaller для типов Book и Author. Это не сработает, поскольку этот маршаллер предназначен для класса java UUID.

Я подозреваю, что эти две проблемы связаны с неправильным пониманием того, как работает генерация кода. Если вам просто нужен SerializationContextInitializer для классов Author и Book, нет необходимости создавать DummyInitializerImpl вручную, и вам определенно не нужно использовать UUIDMarshaller.

1 голос
/ 27 мая 2020

Вы не говорите, какая система сборки используется. maven может быть? Вы добавили процессор аннотаций протопотока в качестве зависимости? Однозначный ответ на эти вопросы поможет разгадать проблему генерации кода. И после этого нам все еще нужно выяснить, кто должен инициализировать это поле dummyInitializer.

...