Skip to content

Commit 381fe85

Browse files
committed
add a sample custom validator for AppProperties and add tests
1 parent a418f21 commit 381fe85

File tree

3 files changed

+37
-5
lines changed

3 files changed

+37
-5
lines changed

spring-boot/configuration/src/main/java/io/reflectoring/validation/AppProperties.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,40 @@
11
package io.reflectoring.validation;
22

33
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.validation.Errors;
5+
import org.springframework.validation.Validator;
46
import org.springframework.validation.annotation.Validated;
57

68
import javax.validation.Valid;
79
import javax.validation.constraints.NotBlank;
810

911
@Validated
1012
@ConfigurationProperties(prefix = "app.properties")
11-
class AppProperties {
13+
class AppProperties implements Validator {
1214

1315
@NotBlank
1416
private String name;
1517

1618
@Valid
1719
private ReportProperties report;
1820

21+
private static final String APP_BASE_NAME = "Application";
22+
23+
public boolean supports(Class clazz) {
24+
return AppProperties.class.isAssignableFrom(clazz);
25+
}
26+
27+
public void validate(Object target, Errors errors) {
28+
29+
AppProperties appProperties = (AppProperties) target;
30+
if (!appProperties.getName().endsWith(APP_BASE_NAME)) {
31+
errors.rejectValue("name", "field.name.malformed",
32+
new Object[]{APP_BASE_NAME},
33+
"The application name must contain [" + APP_BASE_NAME + "] base name");
34+
}
35+
36+
}
37+
1938
public String getName() {
2039
return name;
2140
}

spring-boot/configuration/src/test/java/io/reflectoring/validation/PropertiesInvalidInputTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void setup() {
3737
}
3838

3939
@Test
40-
void whenGivenNameEmpty_thenNotEmptyValidationFails() {
40+
void whenGivenNameEmpty_thenNotBlankValidationFails() {
4141

4242
properties.put("app.properties.name", "");
4343

@@ -49,6 +49,19 @@ void whenGivenNameEmpty_thenNotEmptyValidationFails() {
4949

5050
}
5151

52+
@Test
53+
void whenGivenNameDoesNotContainBaseName_thenCustomAppPropertiesValidatorFails() {
54+
55+
properties.put("app.properties.name", "My App");
56+
57+
assertThatThrownBy(application::run)
58+
.isInstanceOf(ConfigurationPropertiesBindException.class)
59+
.hasRootCauseInstanceOf(BindValidationException.class)
60+
.hasStackTraceContaining("Field error in object 'app.properties' on field 'name'")
61+
.hasStackTraceContaining("[The application name must contain [Application] base name]");
62+
63+
}
64+
5265
@Test
5366
void whenGivenReportIntervalInDaysMoreThan30_thenMaxValidationFails() {
5467

@@ -102,7 +115,7 @@ void whenGivenReportEmailAddressDoesNotContainAnalysisappDomain_thenCustomEmailV
102115
}
103116

104117
@Test
105-
void whenGivenThirdPartyComponentNameIsEmpty_thenNotEmptyValidationFails() {
118+
void whenGivenThirdPartyComponentNameIsEmpty_thenNotBlankValidationFails() {
106119

107120
properties.put("app.third-party.properties.name", "");
108121

spring-boot/configuration/src/test/java/io/reflectoring/validation/PropertiesValidInputTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99

1010
@SpringBootTest(properties = {
11-
"app.properties.name=My Test App",
11+
"app.properties.name=My Test Application",
1212
"app.properties.report.send-emails=true",
1313
"app.properties.report.type=PLAIN_TEXT",
1414
"app.properties.report.interval-in-days=14",
@@ -26,7 +26,7 @@ class PropertiesValidInputTest {
2626
@Test
2727
void appPropertiesAreLoaded() {
2828
assertThat(appProperties).isNotNull();
29-
assertThat(appProperties.getName()).isEqualTo("My Test App");
29+
assertThat(appProperties.getName()).isEqualTo("My Test Application");
3030
assertThat(appProperties.getReport()).isNotNull();
3131
assertThat(appProperties.getReport().getSendEmails()).isTrue();
3232
assertThat(appProperties.getReport().getType()).isEqualTo(ReportType.PLAIN_TEXT);

0 commit comments

Comments
 (0)