ConfigurationProperties (Spring Boot)

Introduction

This page handles several aspects related to the SpringBoot @ConfigurationProperties annotation.

Reference

Guide to @ConfigurationProperties in Spring Boot

https://www.baeldung.com/configuration-properties-in-spring-boot

Implementation (sample)

pom.xml

    <!-- Avoid App custom 'unknown property' IDE warn in application.properties -->

    <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-configuration-processor</artifactId>

      <optional>true</optional>

    </dependency>

application.properties (main)

app.version=@project.version@

app.autho-user.jwt-user-secret-key-base64=${JWT_USER_SECRET_KEY_BASE64:}

application.properties (test)

app.version=@project.version@

app.autho-user.jwt-user-secret-key-base64=${JWT_USER_SECRET_KEY_BASE64:VA3JxfJ/E5oirKXLhn1A59BvWY+NKyShylJj1cqS4pI=}

App.java

import edu.cou.myapp;


@ConfigurationPropertiesScan(basePackages = {"edu.cou.myapp", "oth.er.pack"})// Opt.

@SpringBootApplication

public class App {

...

}

AppProperties.java

import edu.cou.myapp;


import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.validation.annotation.Validated;


import jakarta.validation.Valid;

import jakarta.validation.constraints.NotBlank;

import lombok.AccessLevel;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.Setter;


/**

 * JavaBean binding for application.properties section "0. App custom properties".

 * 

 * <pre>

 * prop=                 //injects empty string ""

 * prop=${NON_EXISTING}  //injects "{NON_EXISTING}"

 * prop=${NON_EXISTING:} //injects empty string ""

 * </pre>

 */

@NoArgsConstructor

@AllArgsConstructor

@Data

@Validated

@ConfigurationPropertiesScan // Since sb-2.2

@ConfigurationProperties(prefix = "app")

public class AppProperties {


  /*- Artifact version */

  @NotBlank

  private String version;


  /** AuthoUser */

  @Setter(value = AccessLevel.NONE)

  @Valid

  private final AuthoUser authoUser = new AuthoUser();


  /** Inner class */

  @NoArgsConstructor

  @AllArgsConstructor

  @Data

  public static class AuthoUser {

    @NotBlank

    private String jwtUserSecretKeyBase64;

  }


}

AppPropertiesTest.java

import edu.cou.myapp;


import static org.junit.jupiter.api.Assertions.assertNotEquals;

import static org.junit.jupiter.api.Assertions.assertTrue;


import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;


import jakarta.inject.Inject;

import lombok.extern.slf4j.Slf4j;


/**

 * AppProperties.

 * 

 * mvnw test -Dtest=AppPropertiesTest

 */

@Slf4j

@SpringBootTest(classes = { App.class })

class AppPropertiesTest {


  @Inject

  private AppProperties appProperties;


  /** Ensure AppProperties is populated from properties file */

  @Test

  void versionTest() {

    String actual = this.appProperties.getVersion();

    log.info(actual);


    boolean versionAvailable = (actual != null && !actual.trim().isBlank());

    assertTrue(versionAvailable);

  }


  /**

   * test/resources/application.properties defines these default values used for unit & integrations

   * tests

   */

  @Test

  void allTest() {

    String jwtUserSecretKeyBase64 = this.appProperties.getAuthoUser().getJwtUserSecretKeyBase64();

    assertNotEquals("", jwtUserSecretKeyBase64.trim());

  }


}