Skip to content

Commit 718372e

Browse files
committed
Merge pull request #14019 from ayudovin
* gh-14019: Polish "Fix NPE in FlywayEndpoint when migration.installedOn is null" Fix NPE in FlywayEndpoint when migration.installedOn is null
2 parents 26af0ca + 27f5e46 commit 718372e

File tree

4 files changed

+47
-4
lines changed

4 files changed

+47
-4
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.actuate.flyway;
1818

1919
import java.time.Instant;
20+
import java.util.Date;
2021
import java.util.HashMap;
2122
import java.util.List;
2223
import java.util.Map;
@@ -38,6 +39,7 @@
3839
* @author Eddú Meléndez
3940
* @author Phillip Webb
4041
* @author Andy Wilkinson
42+
* @author Artsiom Yudovin
4143
* @since 2.0.0
4244
*/
4345
@Endpoint(id = "flyway")
@@ -164,15 +166,19 @@ private FlywayMigration(MigrationInfo info) {
164166
this.script = info.getScript();
165167
this.state = info.getState();
166168
this.installedBy = info.getInstalledBy();
167-
this.installedOn = Instant.ofEpochMilli(info.getInstalledOn().getTime());
168169
this.installedRank = info.getInstalledRank();
169170
this.executionTime = info.getExecutionTime();
171+
this.installedOn = nullSafeToInstant(info.getInstalledOn());
170172
}
171173

172174
private String nullSafeToString(Object obj) {
173175
return (obj != null) ? obj.toString() : null;
174176
}
175177

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

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)