GH-3581: Address NPE in AbstractKafkaHeaderMapper (#3582)

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.2.x` & `3.1.x`**
This commit is contained in:
Soby Chacko
2024-10-21 12:33:42 -04:00
committed by GitHub
parent 1ad67db6bd
commit a17b83efe7
2 changed files with 23 additions and 4 deletions

View File

@@ -44,6 +44,7 @@ import org.springframework.util.PatternMatchUtils;
* @author Gary Russell
* @author Artem Bilan
* @author Sanghyeok An
* @author Soby Chacko
*
* @since 2.1.3
*
@@ -268,11 +269,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";