Использование AutoValueSchema в Apache Beam PCollection дает `RuntimeException: параметр создателя arg0 не соответствует полю схемы`

Я пытаюсь создать PCollection объектов, определенных с помощью AutoValue, и добавил соответствующие аннотации для вывода схемы через DefaultSchema(AutoValueSchema.class). Вот так:

@DefaultSchema(AutoValueSchema.class)
@AutoValue
public abstract class MyAutoClas {
  public abstract String getMyStr();
  public abstract Integer getMyInt();

  @CreateSchema
  public static MyAutoClass create(String myStr, Integer myInt) {
    return new AutoValue_MyAutoClass(myStr, myInt);
  }
}

У меня есть небольшой тестовый пример, который выглядит так:

PCollection<KV<String, MyAutoClass>> result = pipeline
    .apply(Create.of(MyAutoClass.create("abc", 1)))
    .apply(WithKeys.of(in -> in.getMyStr()));

PAssert.that(result).containsInAnyOrder(KV.of("abc", MyAutoClass.create("abc", 1)));
pipeline.run().waitUntilFinish();

Когда я пытаюсь запустить это, я вижу следующие ошибки:

[ERROR] testMyAutoValueClass(.....)  Time elapsed: 1.891 s  <<< ERROR!
java.lang.RuntimeException: Creator parameter arg0 Doesn't correspond to a schema field
    at org.apache.beam.sdk.schemas.utils.ByteBuddyUtils$InvokeUserCreateInstruction.<init>(ByteBuddyUtils.java:717)
    at org.apache.beam.sdk.schemas.utils.ByteBuddyUtils$StaticFactoryMethodInstruction.<init>(ByteBuddyUtils.java:660)
    at org.apache.beam.sdk.schemas.utils.JavaBeanUtils.createStaticCreator(JavaBeanUtils.java:284)
    at org.apache.beam.sdk.schemas.utils.JavaBeanUtils.lambda$getStaticCreator$4(JavaBeanUtils.java:273)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1664)
    at org.apache.beam.sdk.schemas.utils.JavaBeanUtils.getStaticCreator(JavaBeanUtils.java:269)
    at org.apache.beam.sdk.schemas.AutoValueSchema.lambda$schemaTypeCreatorFactory$673bce5b$1(AutoValueSchema.java:80)
    at org.apache.beam.sdk.schemas.UserTypeCreatorFactory.create(UserTypeCreatorFactory.java:21)
  ....... [ETCETERA] ......

person Pablo    schedule 09.02.2020    source источник


Ответы (1)


Эта ошибка возникает из-за того, что ByteBuddy и утилиты отражения Java не могут определить имена параметров вашего @SchemaCreate метода (таким образом, жалуются на какой-то неизвестный параметр arg0 - это имя по умолчанию).

Чтобы гарантировать, что отражение Java может найти имена параметров, вам необходимо указать компилятору включить эту информацию. Если вы строите с Maven, вы можете сделать это следующим образом:

<properties>
    <!-- PLUGIN VERSIONS -->
    <maven-compiler-plugin.version>3.1</maven-compiler-plugin.version>

    <!-- OTHER PROPERTIES -->
    <java.version>1.8</java.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
                <!-- Original answer -->
                <compilerArgument>-parameters</compilerArgument>
                <!-- Or, if you use the plugin version >= 3.6.2 -->
                <parameters>true</parameters>
                <testCompilerArgument>-parameters</testCompilerArgument>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Примечание. Чтобы сделать то же самое с Gradle, используйте этот ответ.

person Pablo    schedule 09.02.2020
comment
Как установить это в Intellij: stackoverflow.com/questions/39217830/ Для пользователей gradle: stackoverflow.com/questions/37463902/ - person Valentyn; 29.05.2020
comment
Мне не требовались дополнительные настройки в IntelliJ. Простое добавление вышеуказанного в Maven сработало. Убедитесь, что вы закомментировали конфигурацию, которая вам не нужна для вашей версии плагина. - person DataMacGyver; 03.12.2020