Spring BootプロパティAPIでアプリケーションのプロパティにアクセスする
@ConfigMapping
や MicroProfile @ConfigProperty
のアプローチではなく、Spring Boot @ConfigurationProperties
アノテーションクラスを使用してアプリケーションのプロパティーにアクセスしたい場合は、このエクステンションを使用することができます。
Spring Boot @ConfigurationProperties にはいくつかの制限があります。例えば、 Map インジェクションはサポートされていません。 オブジェクトへのマッピング設定 の使用を検討してください。
|
前提条件
このガイドを完成させるには、以下が必要です:
-
約15分
-
IDE
-
JDK 17+がインストールされ、
JAVA_HOME
が適切に設定されていること -
Apache Maven 3.9.9
-
使用したい場合は、 Quarkus CLI
-
ネイティブ実行可能ファイルをビルドしたい場合、MandrelまたはGraalVM(あるいはネイティブなコンテナビルドを使用する場合はDocker)をインストールし、 適切に設定していること
ソリューション
次の章で紹介する手順に沿って、ステップを踏んでアプリを作成することをお勧めします。ただし、完成した例にそのまま進んでも構いません。
Gitレポジトリをクローンするか git clone https://github.com/quarkusio/quarkus-quickstarts.git
、 アーカイブ をダウンロードします。
ソリューションは spring-boot-properties-quickstart
ディレクトリ にあります。
Mavenプロジェクトの作成
まず、新しいプロジェクトが必要です。以下のコマンドで新規プロジェクトを作成します。
Windowsユーザーの場合:
-
cmdを使用する場合、(バックスラッシュ
\
を使用せず、すべてを同じ行に書かないでください)。 -
Powershellを使用する場合は、
-D
パラメータを二重引用符で囲んでください。例:"-DprojectArtifactId=spring-boot-properties-quickstart"
このコマンドは、プロジェクトを生成し、 spring-boot-properties
エクステンションをインポートします。
すでにQuarkusプロジェクトが設定されている場合は、プロジェクトのベースディレクトリで以下のコマンドを実行することで、 spring-boot-properties
エクステンションをプロジェクトに追加することができます。
quarkus extension add spring-boot-properties
./mvnw quarkus:add-extension -Dextensions='spring-boot-properties'
./gradlew addExtension --extensions='spring-boot-properties'
これにより、ビルドファイルに以下が追加されます:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-spring-boot-properties</artifactId>
</dependency>
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
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
ブラウザで http://localhost:8080/greeting を開きます。
設定ファイルの変更はすぐに反映されます。
いつものように、アプリケーションは次のようにパッケージ化出来ます:
quarkus build
./mvnw install
./gradlew build
そして、 java -jar target/quarkus-app/quarkus-run.jar
を使って実行します。
次のようにネイティブ実行可能ファイルを生成することもできます。
quarkus build --native
./mvnw install -Dnative
./gradlew build -Dquarkus.native.enabled=true
デフォルト値
では、デフォルト値を設定する挨拶にサフィックスを追加してみましょう。
デフォルト値を持つプロパティは、他のプロパティと同様に設定ファイルで設定できます。ただし、そのプロパティが設定ファイルで定義されていない場合は、デフォルト値が使用されます。
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 クエリパラメータとして渡すことができるかもしれません)、 text
と suffix
はメッセージテンプレートの定義に使用されます。この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;
}
}