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

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.6

  • 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:

CLI
quarkus create app org.acme:spring-boot-properties-quickstart \
    --extension='resteasy-reactive,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.7.1:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=spring-boot-properties-quickstart \
    -Dextensions='resteasy-reactive,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 projeto executando o seguinte comando no diretório base 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 irá 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 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:

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.package.type=native

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;
    }
}

Conteúdo Relacionado