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