1.6. 高度な設定マッピング


次に記載する高度なマッピングの手順は、Red Hat build of Quarkus 固有のエクステンションであり、MicroProfile Config 仕様の範囲には含まれません。

1.6.1. @ConfigMapping を使用してインターフェイスにアノテーションを付ける

関連する複数の設定値を個別に注入する代わりに、@io.smallrye.config.ConfigMapping アノテーションを使用して設定プロパティーをグループ化します。次の手順では、Quarkus config-quickstart プロジェクトで @ConfigMapping アノテーションを使用する方法を説明します。

前提条件

  • config-quickstart プロジェクトを作成している。
  • プロジェクトの application.properties ファイルに greeting.message プロパティーおよび greeting.name プロパティーを定義している。

手順

  1. プロジェクト内の GreetingResource.java ファイルで、次の例に示す内容が含まれていることを確認します。@ConfigPoperties アノテーションを使用して、別の設定ソースからこのクラスに設定プロパティーを注入するには、java.util.Optional および org.eclipse.microprofile.config.inject.ConfigProperty パッケージをインポートする必要があります。

    GreetingResource.java ファイルの例

    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;
        }
    }
    Copy to Clipboard Toggle word wrap

  2. src/main/java/org/acme/config ディレクトリーに GreetingConfiguration.java ファイルを作成します。そのファイルに、ConfigMappingOptional のインポートステートメントを追加します。

    GreetingConfiguration.java ファイルの例

    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();
    }
    Copy to Clipboard Toggle word wrap

    1
    prefix プロパティーはオプションです。たとえば、このシナリオの接頭辞は greeting です。
    2
    greeting.suffix が設定されていない場合、! はデフォルト値として使用されます。
  1. 次に示すとおり、@Inject アノテーションを使用して GreetingConfiguration インスタンスを GreetingResource クラスに注入します。

    注記

    この抜粋は、config-quickstart プロジェクトの初期バージョンにある、@ConfigProperty アノテーションを持つ 3 つのフィールドを置き換えます。

    GreetingResource.java ファイルの例

    @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();
        }
    }
    Copy to Clipboard Toggle word wrap

  2. 開発モードでアプリケーションをコンパイルして起動します。

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    重要

    クラスプロパティーの値を指定しない場合、アプリケーションはコンパイルに失敗し、値が指定されていないことを示す io.smallrye.config.ConfigValidationException エラーが返されます。これは、オプションフィールドやデフォルト値のフィールドには適用されません。

  3. エンドポイントがメッセージを返すことを確認するには、新しいターミナルウィンドウに以下のコマンドを入力します。

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap
  4. 以下のメッセージが表示されます。

    hello quarkus!
    Copy to Clipboard Toggle word wrap
  5. アプリケーションを停止するには、CTRL+C を押します。

1.6.2. ネストされたオブジェクト設定の使用

別のインターフェイス内にネストされたインターフェイスを定義できます。この手順では、Quarkus config-quickstart プロジェクトでネストされたインターフェイスを作成および設定する方法を説明します。

前提条件

  • config-quickstart プロジェクトを作成している。
  • プロジェクトの application.properties ファイルに greeting.message プロパティーおよび greeting.name プロパティーを定義している。

手順

  1. プロジェクトの GreetingResource.java を確認します。このファイルには、/greeting エンドポイントで HTTP リクエストを送信した場合にメッセージを返す hello() メソッドが含まれる GreetingResource クラスがあります。

    GreetingResource.java ファイルの例

    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;
        }
    }
    Copy to Clipboard Toggle word wrap

  2. GreetingConfiguration インスタンスを使用して GreetingConfiguration.java クラスファイルを作成します。このクラスには、GreetingResource クラスで定義される hello() メソッドの外部化設定が含まれます。

    GreetingConfiguration.java ファイルの例

    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();
    }
    Copy to Clipboard Toggle word wrap

  3. 次の例のように、GreetingConfiguration インスタンス内にネストされた ContentConfig クラスを作成します。

    GreetingConfiguration.java ファイルの例

    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();
        }
    }
    Copy to Clipboard Toggle word wrap

    注記

    ContentConfig クラスのメソッド名は content です。プロパティーを正しいインターフェイスに確実にバインドするために、このクラスの設定プロパティーを定義する際の接頭辞に content を使用します。そうすることで、プロパティー名の競合やアプリケーションの予期しない動作も防げます。

  4. 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
    Copy to Clipboard Toggle word wrap

  5. 次の例に示すように、3 つの @ConfigProperty フィールドアノテーションの代わりに、@Inject アノテーションを使用して GreetingConfiguration インスタンスを GreetingResource クラスに注入します。また、/greeting エンドポイントが返すメッセージ文字列を、追加した新しい greeting.content.prize-amount および greeting.content.recipients プロパティーに設定した値で更新する必要があります。

    GreetingResource.java ファイルの例

    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 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();
        }
    }
    Copy to Clipboard Toggle word wrap

  6. 開発モードでアプリケーションをコンパイルして起動します。

    ./mvnw quarkus:dev
    Copy to Clipboard Toggle word wrap
    重要

    クラスプロパティーの値を指定しない場合、アプリケーションはコンパイルに失敗し、値が指定されていないことを示す jakarta.enterprise.inject.spi.DeploymentException 例外を受け取ります。これは、Optional フィールドおよびデフォルト値のフィールドには適用されません。

  7. エンドポイントがメッセージを返すことを確認するには、新しいターミナルウィンドウを開いて次のコマンドを入力します。

    curl http://localhost:8080/greeting
    Copy to Clipboard Toggle word wrap

    2 行の出力を含むメッセージが表示されます。次のように、1 行目にはグリーティングが表示され、2 行目には賞品の受取人および賞品の量が報告されます。

    hello quarkus!
    Jane,John receive total of candies: 10
    Copy to Clipboard Toggle word wrap
  8. アプリケーションを停止するには、CTRL+C を押します。
注記

@ConfigMapping アノテーションが付けられたクラスには、次の例のような Bean Validation アノテーションを付けることができます。

@ConfigMapping(prefix = "greeting")
public class GreetingConfiguration {

    @Size(min = 20)
    public String message;
    public String suffix = "!";
}
Copy to Clipboard Toggle word wrap

プロジェクトには quarkus-hibernate-validator 依存関係が含まれている必要があります。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat