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

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_HOME configurado 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:

CLI
quarkus create app org.acme:spring-boot-properties-quickstart \
    --extension='rest,spring-boot-properties' \
    --no-code
cd spring-boot-properties-quickstart

Para criar um projeto Gradle, adicione a opção --gradle ou --gradle-kotlin-dsl.

Para obter mais informações sobre como instalar e usar a CLI do Quarkus, consulte o guia Quarkus CLI.

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

Para criar um projeto Gradle, adicione a opção '-DbuildTool=gradle' ou '-DbuildTool=gradle-kotlin-dsl'.

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:

CLI
quarkus extension add spring-boot-properties
Maven
./mvnw quarkus:add-extension -Dextensions='spring-boot-properties'
Gradle
./gradlew addExtension --extensions='spring-boot-properties'

Isto adicionará a seguinte dependência ao seu arquivo de build:

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-spring-boot-properties</artifactId>
</dependency>
build.gradle
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:

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./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:

CLI
quarkus build
Maven
./mvnw install
Gradle
./gradlew build

E executada com java -jar target/quarkus-app/quarkus-run.jar.

Também é possível gerar o executável nativo com:

CLI
quarkus build --native
Maven
./mvnw install -Dnative
Gradle
./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;
    }
}

Related content