Skip to content

Commit ed82239

Browse files
committed
Fix potential NullPointerException in HalFormsAdaptingResponseBodyAdvice.
Fixes #2123.
1 parent e656c89 commit ed82239

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/HalFormsAdaptingResponseBodyAdvice.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.http.converter.HttpMessageConverter;
3131
import org.springframework.http.server.ServerHttpRequest;
3232
import org.springframework.http.server.ServerHttpResponse;
33+
import org.springframework.lang.Nullable;
3334
import org.springframework.web.HttpMediaTypeNotAcceptableException;
3435
import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;
3536
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@@ -55,7 +56,7 @@ public boolean supports(MethodParameter returnType, Class<? extends HttpMessageC
5556

5657
@Override
5758
@SneakyThrows
58-
public RepresentationModel<T> beforeBodyWrite(RepresentationModel<T> body, MethodParameter returnType,
59+
public RepresentationModel<T> beforeBodyWrite(@Nullable RepresentationModel<T> body, MethodParameter returnType,
5960
MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType,
6061
ServerHttpRequest request, ServerHttpResponse response) {
6162

@@ -66,7 +67,7 @@ public RepresentationModel<T> beforeBodyWrite(RepresentationModel<T> body, Metho
6667

6768
List<MediaType> accept = request.getHeaders().getAccept();
6869

69-
boolean hasAffordances = body.getLinks().stream()
70+
boolean hasAffordances = body != null && body.getLinks().stream()
7071
.anyMatch(it -> !it.getAffordances().isEmpty());
7172

7273
// Affordances registered -> we're fine as we will render templates

spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/HalFormsAdaptingResponseBodyAdviceTests.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
3636
import org.springframework.http.server.ServletServerHttpRequest;
3737
import org.springframework.http.server.ServletServerHttpResponse;
38+
import org.springframework.lang.Nullable;
3839
import org.springframework.mock.web.MockHttpServletRequest;
3940
import org.springframework.mock.web.MockHttpServletResponse;
4041
import org.springframework.web.HttpMediaTypeNotAcceptableException;
@@ -95,7 +96,16 @@ void issues415IfNoCompatibleMediaTypeWasRequested() {
9596
.isThrownBy(() -> assertResponseContentType(model, MediaTypes.HAL_JSON));
9697
}
9798

98-
private void assertResponseContentType(RepresentationModel<T> model, MediaType mediaType) {
99+
@Test // #2123
100+
void handlesNullBodyCorrectly() {
101+
102+
request.addHeader(HttpHeaders.ACCEPT,
103+
MediaType.toString(Arrays.asList(MediaTypes.HAL_JSON)));
104+
105+
assertThatNoException().isThrownBy(() -> assertResponseContentType(null, MediaTypes.HAL_JSON));
106+
}
107+
108+
private void assertResponseContentType(@Nullable RepresentationModel<T> model, MediaType mediaType) {
99109

100110
this.response.addHeader(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_FORMS_JSON_VALUE);
101111
ServletServerHttpResponse response = new ServletServerHttpResponse(this.response);

0 commit comments

Comments
 (0)