Инструмент обработки аннотаций Vavr не запускается

#java #maven #intellij-idea #vavr

#java #мавен #intellij-идея #вавр

Вопрос:

Я пытаюсь воспроизвести простой пример декомпозиции объекта отсюда. Я добавил в свой проект следующие зависимости:

       <dependency>
        <groupId>io.vavr</groupId>
        <artifactId>vavr</artifactId>
        <version>${vavr.version}</version>
      </dependency>
      <dependency>
        <groupId>io.vavr</groupId>
        <artifactId>vavr-match</artifactId>
        <version>${vavr.version}</version>
      </dependency>
      <dependency>
        <groupId>io.vavr</groupId>
        <artifactId>vavr-match-processor</artifactId>
        <version>${vavr.version}</version>
      </dependency>
 

…где vavr.version находится 0.10.3 и скопировал пример из приведенного выше источника:

 import io.vavr.Tuple;
import io.vavr.Tuple2;
import io.vavr.match.annotation.Patterns;
import io.vavr.match.annotation.Unapply;
import lombok.AllArgsConstructor;
import lombok.Getter;

import static io.vavr.API.$;
import static io.vavr.API.Match;
import static io.vavr.API.Match.*;

public class Example {

  @Getter
  @AllArgsConstructor
  public static class Employee {
    private String name;
    private String id;
  }

  @Patterns
  public static class Demo {
    @Unapply
    static Tuple2<String, String> Employee(Employee Employee) {
      return Tuple.of(Employee.getName(), Employee.getId());
    }
  }

  public static void main(String[] args) {
    Employee person = new Employee("Carl", "89696D8");

    String result = Match(person).of(
      Case(Demo.Employee($("Carl"), $()), (name, id) -> ""),
      Case($(), () -> "notfound")
    );
  }
}
 

Однако первый Case выдает ошибку компиляции Expected 1 argument but found 2 , которая наводит меня на мысль, что обработка аннотаций не сработала и соответствующий шаблон не был сгенерирован. Поправьте меня, если я ошибаюсь.

Я работаю с Intellij 2020.1, и в нем включена обработка аннотаций

Комментарии:

1. Не могли бы вы поделиться примером проекта с зависимостями, где для вас воспроизводится случай. Похоже, есть некоторые проблемы с версией зависимостей 0.10.3. Для меня только 0.9.2 включает класс Tuple.

Ответ №1:

Причина в том, что вы использовали недопустимое имя сгенерированного класса в этой строке:

 Case(Demo.Employee($("Carl"), $()), (name, id) -> "")
 

Его следует заменить на:

 Case(Example_DemoPatterns.$Employee($("Carl"), $()), (name, id) -> name   " "   id)
 

поскольку Demo это статический вложенный класс, к нему должен быть приставка, Example_ и поскольку именно так работает генератор, он должен иметь суффикс Patterns .

Вот полный, доступный для сборки пример, который вы можете клонировать и опробовать. Он содержит примеры как для maven, так и для gradle. Чтобы проверить, как это работает, измените указанную строку, например:

 Case(Example_DemoPatternsWhatever.$Employee($("Carl"), $()), (name, id) -> name   " "   id)
 

а затем запустите:

 mvn exec:java
 

Он завершается с ошибкой (такой класс не генерируется), но при запуске tree target/ вы получите что-то вроде:

 target
├── classes
├── generated-sources
│   └── annotations
│       └── Example_DemoPatterns.java
└── maven-status
    └── maven-compiler-plugin
        └── compile
            └── default-compile
                ├── createdFiles.lst
                └── inputFiles.lst
 

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