web-dev-qa-db-ja.com

外部モジュールのクラスのQuarkusでJandexインデックスを作成する方法

まず最初に、私はそのようなマルチモジュールmaven階層を持っています:

├── project (parent pom.xml)
│   ├── service
│   ├── api-library

だから今問題に:

Api-libraryのクラスを使用するサービスモジュールでJAX-RSエンドポイントを書いています。
クォークスを開始すると、次の警告が表示されます。

13:01:18,784 WARN  [io.qua.dep.ste.ReflectiveHierarchyStep] Unable to properly register the hierarchy of the following classes for reflection as they are not in the Jandex index:
- com.example.Fruit
- com.example.Car
Consider adding them to the index either by creating a Jandex index for your dependency or via quarkus.index-dependency properties.

この2つのクラスcom.example.Fruitおよびcom.example.Carは、api-libraryモジュールにあります。

ですから、application.propertiesのJandexインデックス依存関係に追加する必要があると思います。

しかし、どのようにしてJandexインデックス依存関係をクォークに追加できますか?

16
Emre Isik

Quarkusは自動的にメインモジュールにインデックスを付けますが、JSONとしてシリアル化されたCDI Bean、エンティティ、オブジェクトを含む追加のモジュールがある場合、明示的にインデックスを付ける必要があります。

これを行うには、いくつかの異なる(実装が容易な)オプションがあります。

Jandex Mavenプラグインを使用

以下をpom.xmlに追加してください:

<build>
  <plugins>
    <plugin>
      <groupId>org.jboss.jandex</groupId>
      <artifactId>jandex-maven-plugin</artifactId>
      <version>1.0.7</version>
      <executions>
        <execution>
          <id>make-index</id>
          <goals>
            <goal>jandex</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

依存関係がプロジェクトの外部にあり、一度にすべてのインデックスを構築する場合は、これが最も有益なオプションです。

空のMETA-INF/beans.xmlを追加

空のMETA-INF/beans.xmlファイルをsrc/main/resourcesに追加すると、クラスにもインデックスが作成されます。

クラスはQuarkus自体によってインデックスが作成されます。

他の依存関係のインデックス作成

依存関係を変更できない場合(たとえば、サードパーティの依存関係を考えてみてください)、application.propertiesにエントリを追加して、インデックスを作成できます。

quarkus.index-dependency.<name>.group-id=
quarkus.index-dependency.<name>.artifact-id=
quarkus.index-dependency.<name>.classifier=(this one is optional)

<name>は、依存関係を識別するために選択した名前です。

17
Guillaume Smet

Gradleユーザーの場合、依存するモジュールのbuild.gradleで this プラグインを使用できます。

0
tellisnz

編集(2020年11月2日)

現在、私のマイクロサービスでは、targetsアノテーションのRegisterForReflectionプロパティを幅広く使用しています。これは、ドキュメントによるプロパティの説明です:

/**
 * Alternative classes that should actually be registered for reflection instead of the current class.
 *
 * This allows for classes in 3rd party libraries to be registered without modification or writing an
 * extension. If this is set then the class it is placed on is not registered for reflection, so this should
 * generally just be placed on an empty class that is not otherwise used.
 */

これは、Quarkusベースのプロジェクトでは問題なく機能し、リフレクション用に少数のPOJOを登録する場合の基本的なケースを処理できます。 RegisterForReflectionアノテーションはPOJOを自分で登録しますが、POJOのメソッドからの戻り値の型は登録しません。

より高度な方法は、説明されているように@AutomaticFeatureアノテーションを使用することです here 。私は Reflections Library とカスタムメイドのユーティリティラッパーを使用しています: ReflectUtils

これで、より複雑なタスクを実行できます。

@AutomaticFeature
@RegisterForReflection(targets = {
        com.hotelbeds.hotelapimodel.auto.convert.json.DateSerializer.class,
        TimeDeserializer.class,
        DateSerializer.class,
        TimeSerializer.class,
        RateSerializer.class,
})
public class HotelBedsReflection implements Feature {
    public static Logger log = Utils.findLogger(Reflections.class);

    @Override
    public void beforeAnalysis(BeforeAnalysisAccess access) {
        ReflectUtils.registerPackage(LanguagesRQ.class.getPackage().getName(), Object.class);
        ReflectUtils.registerPackage(AvailabilityRQ.class.getPackage().getName(), Object.class);
        ReflectUtils.registerPackage(Occupancy.class.getPackage().getName(), Object.class);
    }
}

最初の回答

Jandexインデックスを追加し、beans.xmlを追加し、@emre-işık回答で説明されているように他の依存関係のインデックスを作成しようとしましたが、サードパーティクラス(EpAutomationRs)がネイティブモードでのリフレクションに登録されていません。だから、それを登録するための迅速で汚い解決策に終わりました(以下を参照)。クラスを返す未使用のREST JSONエンドポイントを作成しました。

/**
 * the purpose of this method is to register for reflection EpAutomationRs class
 *
 * @return
 */
@GET
@Path(GET_EMPTY_RS)
@Produces(MediaType.APPLICATION_JSON)
public EpAutomationRs entry() {
    return new EpAutomationRs();
}
0
Triphon Penakov