Acessando propriedades da aplicação com a API Spring Boot Properties
Se preferir usar classes anotadas com @ConfigurationProperties do Spring Boot para acessar propriedades da aplicação, em vez da
@ConfigMapping ou uma abordagem @ConfigProperty do MicroProfile, você pode fazer isso com esta extensão.
A anotação @ConfigurationProperties do Spring Boot possui algumas limitações. Por exemplo, não há suporte para injeção de Map.
Considere utilizar a configuração de mapeamento para objetos.
|
Pré-requisitos
Para concluir este guia, você precisa:
-
Cerca de 15 minutos
-
Um IDE
-
JDK 17+ instalado com
JAVA_HOMEconfigurado corretamente -
Apache Maven 3.9.15
-
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 baixe o arquivo.
A solução está localizada em spring-boot-properties-quickstart diretório.
Criar o projeto Maven
Primeiro, precisamos de um novo projeto. Crie-o utilizando 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 seu projeto executando o seguinte comando no diretório raiz do projeto:
quarkus extension add spring-boot-properties
./mvnw quarkus:add-extension -Dextensions='spring-boot-properties'
./gradlew addExtension --extensions='spring-boot-properties'
Isto 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 chamado 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";
}
}
Injeção de 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 possui 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 arquivo src/main/resources/application.properties:
# Your configuration properties
greeting.text=hello
Agora modifique o GreetingResource para utilizar 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 para uma saudação, na qual definiremos um valor padrão.
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á utilizado caso a propriedade não tenha sido definida em um arquivo de configuração.
Prossiga 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 seu respectivo 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
Propriedades com valores opcionais são o meio-termo entre as propriedades obrigatórias e as propriedades com valores padrão.
Embora a ausência de uma propriedade no arquivo de configuração não cause falha na aplicação, ela não terá um valor definido.
Utilizamos 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 seu respectivo 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.
Utilizar esses grupos de propriedades confere mais estrutura à sua configuração. Isto é especialmente útil quando o número de propriedades aumenta.
Devido à classe adicional, os nomes 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: