The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

Spring BootプロパティAPIでアプリケーションのプロパティにアクセスする

@ConfigMapping や MicroProfile @ConfigProperty のアプローチではなく、Spring Boot @ConfigurationProperties アノテーションクラスを使用してアプリケーションのプロパティーにアクセスしたい場合は、このエクステンションを使用することができます。

Spring Boot @ConfigurationProperties にはいくつかの制限があります。例えば、 Map インジェクションはサポートされていません。 オブジェクトへのマッピング設定 の使用を検討してください。

前提条件

このガイドを完成させるには、以下が必要です:

  • 約15分

  • IDE

  • JDK 17+がインストールされ、 JAVA_HOME が適切に設定されていること

  • Apache Maven 3.9.6

  • 使用したい場合は、 Quarkus CLI

  • ネイティブ実行可能ファイルをビルドしたい場合、MandrelまたはGraalVM(あるいはネイティブなコンテナビルドを使用する場合はDocker)をインストールし、 適切に設定していること

ソリューション

次の章で紹介する手順に沿って、ステップを踏んでアプリを作成することをお勧めします。ただし、完成した例にそのまま進んでも構いません。

Gitレポジトリをクローンするか git clone https://github.com/quarkusio/quarkus-quickstarts.gitアーカイブ をダウンロードします。

ソリューションは spring-boot-properties-quickstart ディレクトリ にあります。

Mavenプロジェクトの作成

まず、新しいプロジェクトが必要です。以下のコマンドで新規プロジェクトを作成します。

コマンドラインインタフェース
quarkus create app org.acme:spring-boot-properties-quickstart \
    --extension='resteasy-reactive,spring-boot-properties' \
    --no-code
cd spring-boot-properties-quickstart

Gradleプロジェクトを作成するには、 --gradle または --gradle-kotlin-dsl オプションを追加します。

Quarkus CLIのインストールと使用方法の詳細については、 Quarkus CLI ガイドを参照してください。

Maven
mvn io.quarkus.platform:quarkus-maven-plugin:3.8.3:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=spring-boot-properties-quickstart \
    -Dextensions='resteasy-reactive,spring-boot-properties' \
    -DnoCode
cd spring-boot-properties-quickstart

Gradleプロジェクトを作成するには、 -DbuildTool=gradle または -DbuildTool=gradle-kotlin-dsl オプションを追加します。

Windowsユーザーの場合:

  • cmdを使用する場合、(バックスラッシュ \ を使用せず、すべてを同じ行に書かないでください)。

  • Powershellを使用する場合は、 -D パラメータを二重引用符で囲んでください。例: "-DprojectArtifactId=spring-boot-properties-quickstart"

このコマンドは、プロジェクトを生成し、 spring-boot-properties エクステンションをインポートします。

すでにQuarkusプロジェクトが設定されている場合は、プロジェクトのベースディレクトリで以下のコマンドを実行することで、 spring-boot-properties エクステンションをプロジェクトに追加することができます。

コマンドラインインタフェース
quarkus extension add spring-boot-properties
Maven
./mvnw quarkus:add-extension -Dextensions='spring-boot-properties'
Gradle
./gradlew addExtension --extensions='spring-boot-properties'

これにより、ビルドファイルに以下が追加されます:

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-spring-boot-properties</artifactId>
</dependency>
build.gradle
implementation("io.quarkus:quarkus-spring-boot-properties")

GreetingController

まず、src/main/java/org/acme/spring/boot/properties/GreetingResource.java ファイルに以下のような GreetingResource Jakarta RESTリソースを作成します。

package org.acme.spring.boot.properties;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}

プロパティーの注入

次のようにメッセージフィールドを持つ新しいクラス src/main/java/org/acme/spring/boot/properties/GreetingProperties.java を作成します:

package org.acme.spring.boot.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("greeting")
public class GreetingProperties {

    public String text;
}

ここでは text フィールドはパブリックですが、ゲッターとセッターを持つプライベートフィールドや、インターフェイス内の単なるパブリックゲッターにすることもできます。 text にはデフォルト値がないため、必須とみなされ、設定ファイル(デフォルトでは application.properties )に定義されていないと、アプリケーションの起動に失敗します。 src/main/resources/application.properties ファイルでこのプロパティを定義してください:

# Your configuration properties
greeting.text = hello

そして、 GreetingProperties を使い始めるよう GreetingResource を修正します。

package org.acme.spring.boot.properties;

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
    GreetingProperties properties;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return properties.text;
    }
}

テストを実行し、アプリケーションがまだ正常に機能していることを確認します。

アプリケーションをパッケージ化して実行

次のようにdevモードでアプリケーションを実行します:

コマンドラインインタフェース
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

ブラウザで http://localhost:8080/greeting を開きます。

設定ファイルの変更はすぐに反映されます。

いつものように、アプリケーションは次のようにパッケージ化出来ます:

コマンドラインインタフェース
quarkus build
Maven
./mvnw install
Gradle
./gradlew build

そして、 java -jar target/quarkus-app/quarkus-run.jar を使って実行します。

次のようにネイティブ実行可能ファイルを生成することもできます。

コマンドラインインタフェース
quarkus build --native
Maven
./mvnw install -Dnative
Gradle
./gradlew build -Dquarkus.package.type=native

デフォルト値

では、デフォルト値を設定する挨拶にサフィックスを追加してみましょう。

デフォルト値を持つプロパティは、他のプロパティと同様に設定ファイルで設定できます。ただし、そのプロパティが設定ファイルで定義されていない場合は、デフォルト値が使用されます。

GreetingProperties クラスに新しいフィールドを追加してください。

package org.acme.spring.boot.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("greeting")
public class GreetingProperties {

    public String text;

    public String suffix = "!";
}

そして、 GreetingResource とそのテスト GreetingResourceTest を更新します。

package org.acme.spring.boot.properties;

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
    GreetingProperties properties;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return properties.text + properties.suffix;
    }
}
package org.acme.spring.boot.properties;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
public class GreetingResourceTest {

    @Test
    public void testHelloEndpoint() {
        given()
          .when().get("/greeting")
          .then()
             .statusCode(200)
             .body(is("hello!"));
    }
}

テストを実行して変更を確認します。

オプション値

オプション値を持つプロパティは、標準的なプロパティとデフォルト値を持つプロパティの中間的な存在です。設定ファイルにプロパティがないからといって、アプリケーションが失敗することはありませんが、それにもかかわらず、値が設定されていないことがあります。このようなプロパティの定義には java.util.Optional タイプを使用します。

GreetingProperties クラスに新しいオプションの name プロパティを追加してください。

package org.acme.spring.boot.properties;

import java.util.Optional;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("greeting")
public class GreetingProperties {

    public String text;

    public String suffix = "!";

    public Optional<String> name;
}

そして、 GreetingResource とそのテスト GreetingResourceTest を更新します。

package org.acme.spring.boot.properties;

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
    GreetingProperties properties;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return properties.text + ", " + properties.name.orElse("You") + properties.suffix;
    }
}
package org.acme.spring.boot.properties;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
public class GreetingResourceTest {

    @Test
    public void testHelloEndpoint() {
        given()
          .when().get("/greeting")
          .then()
             .statusCode(200)
             .body(is("hello, You!"));
    }
}

テストを実行して変更を確認します。

プロパティーのグループ化

これで、 GreetingProperties クラスに3つのプロパティができました。 name はどちらかというと実行時のプロパティと考えられますが(将来的には HTTP クエリパラメータとして渡すことができるかもしれません)、 textsuffix はメッセージテンプレートの定義に使用されます。この2つのプロパティを別のインナークラスにまとめてみましょう:

package org.acme.spring.boot.properties;

import java.util.Optional;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("greeting")
public class GreetingProperties {

    public Message message;

    public Optional<String> name;

    public static class Message {

        public String text;

        public String suffix = "!";
    }
}

ここでは Message プロパティクラスはインナークラスとして定義されていますが、トップレベルのクラスとすることも出来ます。

このようなプロパティグループによって、設定にさらなる構造をもたらします。これは、プロパティの数が増えてきたときに特に有効です。

クラスが追加されたため、プロパティ名が変更されています。プロパティファイルと GreetingResource クラスを更新してみましょう。

# Your configuration properties
greeting.message.text = hello
package org.acme.spring.boot.properties;

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
    GreetingProperties properties;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return properties.message.text + ", " + properties.name.orElse("You") + properties.message.suffix;
    }
}

関連コンテンツ