diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java b/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java index e0746fd3a1cd9c6345c8792f204137e73fadc801..ed6c79b32d47e946a5f829b47941937a20fe9231 100644 --- a/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java +++ b/commons/web-common/src/main/java/com/schbrain/common/web/argument/BodyParamMethodArgumentResolver.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.schbrain.common.util.JacksonUtils; import com.schbrain.common.web.annotation.BodyParam; -import com.schbrain.common.web.servlet.ContentCachingRequest; import lombok.Setter; import org.springframework.core.MethodParameter; import org.springframework.util.Assert; @@ -68,14 +67,14 @@ public class BodyParamMethodArgumentResolver extends AbstractNamedValueMethodArg private JsonNode getRequestBody(NativeWebRequest nativeWebRequest) throws IOException { JsonNode requestBody = (JsonNode) nativeWebRequest.getAttribute(REQUEST_BODY_CACHE, SCOPE_REQUEST); if (requestBody == null) { - ContentCachingRequest request = wrapRequest(nativeWebRequest); + HttpServletRequest request = wrapRequest(nativeWebRequest); requestBody = objectMapper.readTree(request.getInputStream()); nativeWebRequest.setAttribute(REQUEST_BODY_CACHE, requestBody, SCOPE_REQUEST); } return requestBody; } - private ContentCachingRequest wrapRequest(NativeWebRequest request) { + private HttpServletRequest wrapRequest(NativeWebRequest request) { return wrapIfRequired(request.getNativeRequest(HttpServletRequest.class)); } diff --git a/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java b/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java index b1f87e71c89d21a64b5549de5068c6982e629a25..0e0f5d2779c4166518eb10db5578647cce0dc975 100644 --- a/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java +++ b/commons/web-common/src/main/java/com/schbrain/common/web/utils/RequestContentCachingUtils.java @@ -3,10 +3,13 @@ package com.schbrain.common.web.utils; import com.schbrain.common.util.ValidateUtils; import com.schbrain.common.web.servlet.ContentCachingRequest; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; import javax.servlet.http.HttpServletRequest; +import static org.springframework.http.HttpMethod.POST; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import static org.springframework.web.util.WebUtils.getNativeRequest; /** @@ -19,10 +22,10 @@ public class RequestContentCachingUtils { /** * Make request content cacheable to avoid stream closed error after inputStream closed */ - public static ContentCachingRequest wrapIfRequired(HttpServletRequest request) { + public static HttpServletRequest wrapIfRequired(HttpServletRequest request) { ValidateUtils.notNull(request, "request must not be null"); - if (request instanceof ContentCachingRequest) { - return (ContentCachingRequest) request; + if (request instanceof ContentCachingRequest || !isJsonPostRequest(request)) { + return request; } else { return new ContentCachingRequest(request); } @@ -43,10 +46,13 @@ public class RequestContentCachingUtils { public static String getRequestBody(HttpServletRequest request, String characterEncoding) { ContentCachingRequest requestToUse = getNativeRequest(request, ContentCachingRequest.class); if (requestToUse == null) { - log.warn("request is not an instance of {}", ContentCachingRequest.class.getSimpleName()); return null; } return requestToUse.getContentAsString(characterEncoding); } + private static boolean isJsonPostRequest(HttpServletRequest request) { + return POST.matches(request.getMethod()) && StringUtils.contains(request.getContentType(), APPLICATION_JSON_VALUE); + } + }