Fix potential NullPointerException in HalFormsAdaptingResponseBodyAdvice.

Fixes #2123.
This commit is contained in:
Oliver Drotbohm
2022-03-28 16:50:34 +02:00
parent e656c89101
commit ed822390d8
2 changed files with 14 additions and 3 deletions

View File

@@ -30,6 +30,7 @@ import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@@ -55,7 +56,7 @@ class HalFormsAdaptingResponseBodyAdvice<T extends RepresentationModel<T>>
@Override
@SneakyThrows
public RepresentationModel<T> beforeBodyWrite(RepresentationModel<T> body, MethodParameter returnType,
public RepresentationModel<T> beforeBodyWrite(@Nullable RepresentationModel<T> body, MethodParameter returnType,
MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
@@ -66,7 +67,7 @@ class HalFormsAdaptingResponseBodyAdvice<T extends RepresentationModel<T>>
List<MediaType> accept = request.getHeaders().getAccept();
boolean hasAffordances = body.getLinks().stream()
boolean hasAffordances = body != null && body.getLinks().stream()
.anyMatch(it -> !it.getAffordances().isEmpty());
// Affordances registered -> we're fine as we will render templates

View File

@@ -35,6 +35,7 @@ import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse;
import org.springframework.lang.Nullable;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.HttpMediaTypeNotAcceptableException;
@@ -95,7 +96,16 @@ class HalFormsAdaptingResponseBodyAdviceTests<T extends RepresentationModel<T>>
.isThrownBy(() -> assertResponseContentType(model, MediaTypes.HAL_JSON));
}
private void assertResponseContentType(RepresentationModel<T> model, MediaType mediaType) {
@Test // #2123
void handlesNullBodyCorrectly() {
request.addHeader(HttpHeaders.ACCEPT,
MediaType.toString(Arrays.asList(MediaTypes.HAL_JSON)));
assertThatNoException().isThrownBy(() -> assertResponseContentType(null, MediaTypes.HAL_JSON));
}
private void assertResponseContentType(@Nullable RepresentationModel<T> model, MediaType mediaType) {
this.response.addHeader(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_FORMS_JSON_VALUE);
ServletServerHttpResponse response = new ServletServerHttpResponse(this.response);