1.7. 高度な設定マッピング
次に記載する高度なマッピングの手順は、Red Hat build of Quarkus 固有のエクステンションであり、MicroProfile Config 仕様の範囲には含まれません。
1.7.1. @ConfigMapping を使用してインターフェイスにアノテーションを付ける リンクのコピーリンクがクリップボードにコピーされました!
関連する複数の設定値を個別に注入する代わりに、@io.smallrye.config.ConfigMapping アノテーションを使用して設定プロパティーをグループ化します。次の手順では、Quarkus config-quickstart プロジェクトで @ConfigMapping アノテーションを使用する方法を説明します。
前提条件
-
config-quickstartプロジェクトを作成している。 -
プロジェクトの
application.propertiesファイルにgreeting.messageプロパティーおよびgreeting.nameプロパティーを定義している。
手順
プロジェクト内の
GreetingResource.javaファイルで、次の例に示す内容が含まれていることを確認します。@ConfigPropertyアノテーションを使用して別の設定ソースからこのクラスに設定プロパティーを挿入するには、java.util.Optionalおよびorg.eclipse.microprofile.config.inject.ConfigPropertyパッケージをインポートする必要があります。GreetingResource.javaファイルの例package org.acme.config; import java.util.Optional; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/greeting") public class GreetingResource { @ConfigProperty(name = "greeting.message") String message; @ConfigProperty(name = "greeting.suffix", defaultValue="!") String suffix; @ConfigProperty(name = "greeting.name") Optional<String> name; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + suffix; } }src/main/java/org/acme/configディレクトリーにGreetingConfiguration.javaファイルを作成します。そのファイルに、ConfigMappingとOptionalのインポートステートメントを追加します。GreetingConfiguration.javaファイルの例package org.acme.config; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.util.Optional; @ConfigMapping(prefix = "greeting")1 public interface GreetingConfiguration { String message(); @WithDefault("!")2 String suffix(); Optional<String> name(); }
次に示すとおり、
@Injectアノテーションを使用してGreetingConfigurationインスタンスをGreetingResourceクラスに注入します。注記この抜粋は、
config-quickstartプロジェクトの初期バージョンにある、@ConfigPropertyアノテーションを持つ 3 つのフィールドを置き換えます。GreetingResource.javaファイルの例package org.acme.config; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; @Path("/greeting") public class GreetingResource { @Inject GreetingConfiguration config; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return config.message() + " " + config.name().orElse("world") + config.suffix(); } }開発モードでアプリケーションをコンパイルして起動します。
./mvnw quarkus:dev重要クラスプロパティーの値を指定しない場合、アプリケーションはコンパイルに失敗し、値が指定されていないことを示す
io.smallrye.config.ConfigValidationExceptionエラーが返されます。これは、オプションフィールドやデフォルト値のフィールドには適用されません。エンドポイントがメッセージを返すことを確認するには、新しいターミナルウィンドウに以下のコマンドを入力します。
curl http://localhost:8080/greeting以下のメッセージが表示されます。
hello quarkus!- アプリケーションを停止するには、CTRL+C を押します。
1.7.2. ネストされたオブジェクト設定の使用 リンクのコピーリンクがクリップボードにコピーされました!
別のインターフェイス内にネストされたインターフェイスを定義できます。この手順では、Quarkus config-quickstart プロジェクトでネストされたインターフェイスを作成および設定する方法を説明します。
前提条件
-
config-quickstartプロジェクトを作成している。 -
プロジェクトの
application.propertiesファイルにgreeting.messageプロパティーおよびgreeting.nameプロパティーを定義している。
手順
プロジェクトの
GreetingResource.javaを確認します。このファイルには、/greetingエンドポイントで HTTP リクエストを送信した場合にメッセージを返すhello()メソッドが含まれるGreetingResourceクラスがあります。GreetingResource.javaファイルの例package org.acme.config; import java.util.Optional; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/greeting") public class GreetingResource { @ConfigProperty(name = "greeting.message") String message; @ConfigProperty(name = "greeting.suffix", defaultValue="!") String suffix; @ConfigProperty(name = "greeting.name") Optional<String> name; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return message + " " + name.orElse("world") + suffix; } }GreetingConfigurationインスタンスを使用してGreetingConfiguration.javaクラスファイルを作成します。このクラスには、GreetingResourceクラスで定義されるhello()メソッドの外部化設定が含まれます。GreetingConfiguration.javaファイルの例package org.acme.config; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.util.Optional; @ConfigMapping(prefix = "greeting") public interface GreetingConfiguration { String message(); @WithDefault("!") String suffix(); Optional<String> name(); }次の例のように、
GreetingConfigurationインスタンス内にネストされたContentConfigインターフェイスを作成します。GreetingConfiguration.javaファイルの例package org.acme.config; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; import java.util.List; import java.util.Optional; @ConfigMapping(prefix = "greeting") public interface GreetingConfiguration { String message(); @WithDefault("!") String suffix(); Optional<String> name(); ContentConfig content(); interface ContentConfig { Integer prizeAmount(); List<String> recipients(); } }注記ContentConfigインターフェイスのメソッド名はcontentです。プロパティーを正しいインターフェイスに確実にバインドするために、このクラスの設定プロパティーを定義する際の接頭辞にcontentを使用します。そうすることで、プロパティー名の競合やアプリケーションの予期しない動作も防げます。application.propertiesファイルでgreeting.content.prize-amountおよびgreeting.content.recipients設定プロパティーを定義します。次の例は、
GreetingConfigurationインスタンスとContentConfigインターフェイスに定義されたプロパティーを示しています。application.propertiesファイルの例greeting.message=hello greeting.name=quarkus greeting.content.prize-amount=10 greeting.content.recipients=Jane,John次の例に示すように、3 つの
@ConfigPropertyフィールドアノテーションの代わりに、@Injectアノテーションを使用してGreetingConfigurationインスタンスをGreetingResourceクラスに注入します。また、/greetingエンドポイントが返すメッセージ文字列を、追加した新しいgreeting.content.prize-amountおよびgreeting.content.recipientsプロパティーに設定した値で更新する必要があります。GreetingResource.javaファイルの例package org.acme.config; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import jakarta.inject.Inject; @Path("/greeting") public class GreetingResource { @Inject GreetingConfiguration config; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return config.message() + " " + config.name().orElse("world") + config.suffix() + "\n" + config.content().recipients() + " receive total of candies: " + config.content().prizeAmount(); } }開発モードでアプリケーションをコンパイルして起動します。
./mvnw quarkus:dev重要クラスプロパティーの値を指定しない場合、アプリケーションはコンパイルに失敗し、値が指定されていないことを示す
jakarta.enterprise.inject.spi.DeploymentException例外を受け取ります。これは、Optionalフィールドおよびデフォルト値のフィールドには適用されません。エンドポイントがメッセージを返すことを確認するには、新しいターミナルウィンドウを開いて次のコマンドを入力します。
curl http://localhost:8080/greeting2 行の出力を含むメッセージが表示されます。次のように、1 行目にはグリーティングが表示され、2 行目には賞品の受取人および賞品の量が報告されます。
hello quarkus! [Jane, John] receive total of candies: 10- アプリケーションを停止するには、CTRL+C を押します。
@ConfigMapping アノテーションが付けられたクラスには、次の例のような Bean バリデーションアノテーションを付けることができます。
@ConfigMapping(prefix = "greeting")
public class GreetingConfiguration {
@Size(min = 20)
public String message;
public String suffix = "!";
}
プロジェクトには quarkus-hibernate-validator 依存関係が含まれている必要があります。