まず最初に、私はそのようなマルチモジュール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インデックス依存関係をクォークに追加できますか?
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>
は、依存関係を識別するために選択した名前です。
Gradleユーザーの場合、依存するモジュールのbuild.gradleで this プラグインを使用できます。
現在、私のマイクロサービスでは、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();
}