Skip to content

Commit 8096c9d

Browse files
authored
GH-3319: Fix NPE in the KafkaListenerEndpointRegistry (#3320)
The `KafkaListenerEndpointRegistry.getUnregisteredListenerContainer()` returns `null` when container is already present in the internal `unregisteredContainers` cache * Fix `KafkaListenerEndpointRegistry.getUnregisteredListenerContainer()` to return a container instance from the `unregisteredContainers` cache **Auto-cherry-pick to `3.2.x` & `3.1.x`**
1 parent 4de29ee commit 8096c9d

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

spring-kafka/src/main/java/org/springframework/kafka/config/KafkaListenerEndpointRegistry.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public MessageListenerContainer getUnregisteredListenerContainer(String id) {
168168
refreshContextContainers();
169169
return this.unregisteredContainers.get(id);
170170
}
171-
return null;
171+
return container;
172172
}
173173

174174
/**

spring-kafka/src/test/java/org/springframework/kafka/config/KafkaListenerEndpointRegistryTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@
3535
import org.junit.jupiter.params.provider.Arguments;
3636
import org.junit.jupiter.params.provider.MethodSource;
3737

38+
import org.springframework.context.support.GenericApplicationContext;
39+
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;
3840
import org.springframework.kafka.listener.MessageListenerContainer;
3941

4042
/**
4143
* @author Gary Russell
4244
* @author Joo Hyuk Kim
45+
* @author Artem Bilan
46+
*
4347
* @since 2.8.9
4448
*/
4549
public class KafkaListenerEndpointRegistryTests {
@@ -139,6 +143,21 @@ void getListenerContainersMatchingBiPredicate(List<String> names, BiPredicate<St
139143
assertThat(listeners).hasSize(expectedCount);
140144
}
141145

146+
@Test
147+
void verifyUnregisteredListenerContainer() {
148+
KafkaListenerEndpointRegistry registry = new KafkaListenerEndpointRegistry();
149+
GenericApplicationContext applicationContext = new GenericApplicationContext();
150+
ConcurrentMessageListenerContainer<?, ?> listenerContainerMock = mock(ConcurrentMessageListenerContainer.class);
151+
given(listenerContainerMock.getListenerId()).willReturn("testListenerContainer");
152+
applicationContext.registerBean(ConcurrentMessageListenerContainer.class, () -> listenerContainerMock);
153+
applicationContext.refresh();
154+
registry.setApplicationContext(applicationContext);
155+
// Lazy-load from application context
156+
assertThat(registry.getUnregisteredListenerContainer("testListenerContainer")).isNotNull();
157+
// From internal map
158+
assertThat(registry.getUnregisteredListenerContainer("testListenerContainer")).isNotNull();
159+
}
160+
142161
/**
143162
* Provides parameters for the getListenerContainersMatchingBiPredicate test.
144163
* Each set of parameters includes a list of names, a bi-predicate, and the expected count of matching containers.

0 commit comments

Comments
 (0)