Acessando propriedades da aplicação com Spring Boot Properties API
If you prefer to use Spring Boot @ConfigurationProperties
annotated class to access application properties instead of
@ConfigMapping
or a MicroProfile @ConfigProperty
approach, you can do that with this extension.
A anotação @ConfigurationProperties do Spring Boot tem algumas limitações. Por exemplo, não há suporte para a injeção de Map . Considere a possibilidade de usar a configuração de mapeamento para objetos .
|
Pré-requisitos
Para concluir este guia, você precisa:
-
Cerca de 15 minutos
-
Um IDE
-
JDK 17+ installed with
JAVA_HOME
configured appropriately -
Apache Maven 3.9.9
-
Opcionalmente, o Quarkus CLI se você quiser usá-lo
-
Opcionalmente, Mandrel ou GraalVM instalado e configurado apropriadamente se você quiser criar um executável nativo (ou Docker se você usar uma compilação de contêiner nativo)
Solução
Recomendamos que você siga as instruções nas próximas seções e crie a aplicação passo a passo. No entanto, você pode ir direto para o exemplo concluído.
Clone o repositório Git: git clone https://github.com/quarkusio/quarkus-quickstarts.git
, ou faça o download do arquivo.
A solução está localizada no: diretório spring-boot-properties-quickstart
.
Criar o projeto Maven
Primeiro, precisamos de um novo projeto. Crie um novo projeto com o seguinte comando:
Para usuários do Windows:
-
Se estiver usando cmd, (não use barra invertida '\' e coloque tudo na mesma linha)
-
Se estiver usando o Powershell, envolva os parâmetros '-D' entre aspas duplas, por exemplo, '"-DprojectArtifactId=spring-boot-properties-quickstart"'
Este comando gera um projeto e importa a extensão spring-boot-properties
.
Se já tiver o projeto Quarkus configurado, você pode adicionar a extensão spring-boot-properties
ao projeto executando o seguinte comando no diretório base do projeto:
quarkus extension add spring-boot-properties
./mvnw quarkus:add-extension -Dextensions='spring-boot-properties'
./gradlew addExtension --extensions='spring-boot-properties'
Isto irá adicionar a seguinte dependência ao seu arquivo de build:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-spring-boot-properties</artifactId>
</dependency>
implementation("io.quarkus:quarkus-spring-boot-properties")
GreetingController
Primeiro, crie um recurso Jakarta REST com o nome GreetingResource
no arquivo src/main/java/org/acme/spring/boot/properties/GreetingResource.java
da seguinte forma:
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";
}
}
Injetando propriedades
Crie uma nova classe src/main/java/org/acme/spring/boot/properties/GreetingProperties.java
com um atributo text
:
package org.acme.spring.boot.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("greeting")
public class GreetingProperties {
public String text;
}
Aqui, o atributo text
é público, mas também poderia ser um atributo privado com getter e setter ou apenas um getter público em uma interface. Como o text
não tem um valor padrão, ele é considerado obrigatório e, a menos que seja definido em um arquivo de configuração ( application.properties
por padrão), a aplicação não será iniciada. Defina essa propriedade no seu arquivo src/main/resources/application.properties
:
# Your configuration properties
greeting.text=hello
Agora modifique GreetingResource
para começar a usar o GreetingProperties
:
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;
}
}
Execute os testes para verificar se a aplicação continua funcionando corretamente.
Empacote e execute a aplicação
Execute a aplicação em modo de desenvolvimento com:
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
Abra o seu navegador em http://localhost:8080/greeting .
A alteração do arquivo de configuração é imediatamente refletida.
Como de costume, a aplicação pode ser empacotada utilizando:
quarkus build
./mvnw install
./gradlew build
E executada com java -jar target/quarkus-app/quarkus-run.jar
.
Também é possível gerar o executável nativo com:
quarkus build --native
./mvnw install -Dnative
./gradlew build -Dquarkus.native.enabled=true
Valores padrão
Agora vamos adicionar um sufixo em greeting, no qual definiremos um valor padrão.
As propriedades com valores padrão podem ser configuradas em um arquivo de configuração como qualquer outra propriedade. No entanto, o valor padrão será usado se a propriedade não tiver sido definida em um arquivo de configuração.
Vá em frente e adicione o novo campo suffix
à classe 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 = "!";
}
E atualize a classe GreetingResource
e o seu respetivo teste 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!"));
}
}
Execute os testes para verificar a alteração.
Valores opcionais
As propriedades com valores opcionais são o meio-termo entre as propriedades padrão e as propriedades com valores padrão. Embora uma propriedade ausente em um arquivo de configuração não cause falha na aplicação, ela não terá um valor definido. Usamos o tipo java.util.Optional
para definir esse tipo de propriedade.
Adicione uma propriedade opcional name
à classe GreetingProperties
:
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;
}
E atualize a classe GreetingResource
e o seu respetivo teste 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!"));
}
}
Execute os testes para verificar a alteração.
Agrupando propriedades
Agora temos três propriedades em nossa classe GreetingProperties
. Embora name
possa ser considerada mais uma propriedade de tempo de execução (e talvez possa ser passada como um parâmetro de consulta HTTP no futuro), text
e suffix
são usadas para definir um modelo de mensagem. Vamos agrupar essas duas propriedades em uma classe interna separada:
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 = "!";
}
}
Aqui, a classe de propriedades Message
é definida como uma classe interna, mas também pode ser uma classe de nível superior.
Ter esses grupos de propriedades traz mais estrutura à sua configuração. Isso é especialmente útil quando o número de propriedades aumenta.
Devido à classe adicional, o nome das propriedades foram alterados. Vamos atualizar o arquivo de propriedades e a classe 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;
}
}
Mais guias de Spring
O Quarkus possui mais funcionalidades compatíveis com o Spring. Para mais informações, consulte os seguintes guias: