GH-3581: Address NPE in AbstractKafkaHeaderMapper

Fixes: #3581

https://github.com/spring-projects/spring-kafka/issues/3581

- Optimize headerValueToAddIn method by adding better null checks
- Add unit test to verify

**Auto-cherry-pick to `3.1.x`**

# Conflicts:
#	spring-kafka/src/main/java/org/springframework/kafka/support/AbstractKafkaHeaderMapper.java
This commit is contained in:
Soby Chacko
2024-10-21 12:33:42 -04:00
committed by Artem Bilan
parent dbaf9fd44e
commit cb8740dc7c
2 changed files with 23 additions and 4 deletions

View File

@@ -43,6 +43,7 @@ import org.springframework.util.PatternMatchUtils;
*
* @author Gary Russell
* @author Artem Bilan
* @author Soby Chacko
*
* @since 2.1.3
*
@@ -267,11 +268,11 @@ public abstract class AbstractKafkaHeaderMapper implements KafkaHeaderMapper {
* @return the value to add.
*/
protected Object headerValueToAddIn(Header header) {
Object mapped = mapRawIn(header.key(), header.value());
if (mapped == null) {
mapped = header.value();
if (header == null || header.value() == null) {
return null;
}
return mapped;
String mapped = mapRawIn(header.key(), header.value());
return mapped != null ? mapped : header.value();
}
@Nullable

View File

@@ -47,6 +47,10 @@ import org.springframework.util.MimeTypeUtils;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
/**
* @author Gary Russell
@@ -360,6 +364,20 @@ public class DefaultKafkaHeaderMapperTests {
assertThat(headers.lastHeader(SerializationUtils.VALUE_DESERIALIZER_EXCEPTION_HEADER)).isNull();
}
@Test
void ensureNullHeaderValueHandledGraciously() {
DefaultKafkaHeaderMapper mapper = new DefaultKafkaHeaderMapper();
Header mockHeader = mock(Header.class);
given(mockHeader.value()).willReturn(null);
Object result = mapper.headerValueToAddIn(mockHeader);
assertThat(result).isNull();
verify(mockHeader).value();
verify(mockHeader, never()).key();
}
public static final class Foo {
private String bar = "bar";