Skip to content

Commit 27f5e46

Browse files
committed
Polish "Fix NPE in FlywayEndpoint when migration.installedOn is null"
Closes gh-14019
1 parent 83fbdc6 commit 27f5e46

File tree

4 files changed

+45
-9
lines changed

4 files changed

+45
-9
lines changed

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/flyway/FlywayEndpoint.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,18 +168,17 @@ private FlywayMigration(MigrationInfo info) {
168168
this.installedBy = info.getInstalledBy();
169169
this.installedRank = info.getInstalledRank();
170170
this.executionTime = info.getExecutionTime();
171-
this.installedOn = toEpochMilli(info.getInstalledOn());
172-
}
173-
174-
private Instant toEpochMilli(Date installedOn) {
175-
return (installedOn != null) ? Instant.ofEpochMilli(installedOn.getTime())
176-
: null;
171+
this.installedOn = nullSafeToInstant(info.getInstalledOn());
177172
}
178173

179174
private String nullSafeToString(Object obj) {
180175
return (obj != null) ? obj.toString() : null;
181176
}
182177

178+
private Instant nullSafeToInstant(Date date) {
179+
return (date != null) ? Instant.ofEpochMilli(date.getTime()) : null;
180+
}
181+
183182
public MigrationType getType() {
184183
return this.type;
185184
}

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/flyway/FlywayEndpointTests.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@
1616

1717
package org.springframework.boot.actuate.flyway;
1818

19+
import java.util.Map;
20+
1921
import org.junit.Test;
2022

23+
import org.springframework.boot.actuate.flyway.FlywayEndpoint.FlywayDescriptor;
2124
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
25+
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy;
2226
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
2327
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2428
import org.springframework.context.ApplicationContext;
@@ -40,9 +44,28 @@ public class FlywayEndpointTests {
4044
@Test
4145
public void flywayReportIsProduced() {
4246
new ApplicationContextRunner().withUserConfiguration(Config.class)
43-
.run((context) -> assertThat(
44-
context.getBean(FlywayEndpoint.class).flywayBeans().getContexts()
45-
.get(context.getId()).getFlywayBeans()).hasSize(1));
47+
.run((context) -> {
48+
Map<String, FlywayDescriptor> flywayBeans = context
49+
.getBean(FlywayEndpoint.class).flywayBeans().getContexts()
50+
.get(context.getId()).getFlywayBeans();
51+
assertThat(flywayBeans).hasSize(1);
52+
assertThat(flywayBeans.values().iterator().next().getMigrations())
53+
.hasSize(3);
54+
});
55+
}
56+
57+
@Test
58+
public void whenFlywayHasBeenBaselinedFlywayReportIsProduced() {
59+
new ApplicationContextRunner()
60+
.withUserConfiguration(BaselinedFlywayConfig.class, Config.class)
61+
.run((context) -> {
62+
Map<String, FlywayDescriptor> flywayBeans = context
63+
.getBean(FlywayEndpoint.class).flywayBeans().getContexts()
64+
.get(context.getId()).getFlywayBeans();
65+
assertThat(flywayBeans).hasSize(1);
66+
assertThat(flywayBeans.values().iterator().next().getMigrations())
67+
.hasSize(3);
68+
});
4669
}
4770

4871
@Configuration
@@ -56,4 +79,18 @@ public FlywayEndpoint endpoint(ApplicationContext context) {
5679

5780
}
5881

82+
@Configuration
83+
public static class BaselinedFlywayConfig {
84+
85+
@Bean
86+
public FlywayMigrationStrategy baseliningMigrationStrategy() {
87+
return (flyway) -> {
88+
flyway.setBaselineVersionAsString("2");
89+
flyway.baseline();
90+
flyway.migrate();
91+
};
92+
}
93+
94+
}
95+
5996
}

spring-boot-project/spring-boot-actuator/src/test/resources/db/migration/V2__update.sql

Whitespace-only changes.

spring-boot-project/spring-boot-actuator/src/test/resources/db/migration/V3__update.sql

Whitespace-only changes.

0 commit comments

Comments
 (0)