Skip to content

Commit b4ad475

Browse files
committed
Use no-op lambda as default action for step action
Prior to this commit the StartupStep.end method was being called from the default step action. However when overriding the default step action this might lead to the StartupStep.end method not being called. As in the case of a failure, as that enriches the information being written. This commit also introduces a test for the failure case showing that there is a missed call to end with the initial solution. See: gh-22776
1 parent 1b7d5e1 commit b4ad475

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationRunListeners.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,15 @@ private void callFailedListener(SpringApplicationRunListener listener, Configura
103103
}
104104

105105
private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction) {
106-
doWithListeners(stepName, listenerAction, StartupStep::end);
106+
doWithListeners(stepName, listenerAction, step -> {});
107107
}
108108

109109
private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction,
110110
Consumer<StartupStep> stepAction) {
111111
StartupStep step = this.applicationStartup.start(stepName);
112112
this.listeners.forEach(listenerAction);
113113
stepAction.accept(step);
114+
step.end();
114115
}
115116

116117
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java

+22
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,28 @@ void customApplicationStartupPublishStartupSteps() {
11791179
assertThat(startCount).isEqualTo(endCount);
11801180
}
11811181

1182+
@Test
1183+
void customApplicationStartupPublishStartupStepsWithFailure() {
1184+
ApplicationStartup applicationStartup = mock(ApplicationStartup.class);
1185+
StartupStep startupStep = mock(StartupStep.class);
1186+
given(applicationStartup.start(anyString())).willReturn(startupStep);
1187+
given(startupStep.tag(anyString(), anyString())).willReturn(startupStep);
1188+
given(startupStep.tag(anyString(), ArgumentMatchers.<Supplier<String>>any())).willReturn(startupStep);
1189+
SpringApplication application = new SpringApplication(BrokenPostConstructConfig.class);
1190+
application.setWebApplicationType(WebApplicationType.NONE);
1191+
application.setApplicationStartup(applicationStartup);
1192+
assertThatExceptionOfType(BeanCreationException.class).isThrownBy(application::run);
1193+
1194+
verify(applicationStartup).start("spring.boot.application.starting");
1195+
verify(applicationStartup).start("spring.boot.application.environment-prepared");
1196+
verify(applicationStartup).start("spring.boot.application.failed");
1197+
long startCount = mockingDetails(applicationStartup).getInvocations().stream()
1198+
.filter((invocation) -> invocation.getMethod().toString().contains("start(")).count();
1199+
long endCount = mockingDetails(startupStep).getInvocations().stream()
1200+
.filter((invocation) -> invocation.getMethod().toString().contains("end(")).count();
1201+
assertThat(startCount).isEqualTo(endCount);
1202+
}
1203+
11821204
private <S extends AvailabilityState> ArgumentMatcher<ApplicationEvent> isAvailabilityChangeEventWithState(
11831205
S state) {
11841206
return (argument) -> (argument instanceof AvailabilityChangeEvent<?>)

0 commit comments

Comments
 (0)