From 46ae5205faab95ac2bba04803f8e11c245fc48c8 Mon Sep 17 00:00:00 2001 From: tanghc Date: Mon, 26 Aug 2019 14:51:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=8F=82=E6=95=B0=E7=BB=91?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../param/ApiArgumentResolver.java | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/param/ApiArgumentResolver.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/param/ApiArgumentResolver.java index cc0660e1..d3bae967 100644 --- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/param/ApiArgumentResolver.java +++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/param/ApiArgumentResolver.java @@ -12,13 +12,17 @@ import org.springframework.core.MethodParameter; import org.springframework.util.ReflectionUtils; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.context.request.WebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.multipart.MultipartRequest; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -95,9 +99,27 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver { * @return 没有返回null */ protected Object getParamObject(MethodParameter methodParameter, NativeWebRequest nativeWebRequest) { + Class parameterType = methodParameter.getParameterType(); + // WebRequest / NativeWebRequest / ServletWebRequest + if (WebRequest.class.isAssignableFrom(parameterType)) { + if (!parameterType.isInstance(nativeWebRequest)) { + throw new IllegalStateException( + "Current request is not of type [" + parameterType.getName() + "]: " + nativeWebRequest); + } + return nativeWebRequest; + } + + // ServletRequest / HttpServletRequest / MultipartRequest / MultipartHttpServletRequest + if (ServletRequest.class.isAssignableFrom(parameterType) || MultipartRequest.class.isAssignableFrom(parameterType)) { + return resolveNativeRequest(nativeWebRequest, parameterType); + } + + // ServletResponse, HttpServletResponse + if (ServletResponse.class.isAssignableFrom(parameterType)) { + return resolveNativeResponse(nativeWebRequest, parameterType); + } HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest(); JSONObject requestParams = OpenUtil.getRequestParams(request); - Class parameterType = methodParameter.getParameterType(); // 方法参数类型 Class bizObjClass = parameterType; boolean isOpenRequestParam = parameterType == OpenContext.class; @@ -112,6 +134,24 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver { return isOpenRequestParam ? openContext : bizObj; } + private T resolveNativeRequest(NativeWebRequest webRequest, Class requiredType) { + T nativeRequest = webRequest.getNativeRequest(requiredType); + if (nativeRequest == null) { + throw new IllegalStateException( + "Current request is not of type [" + requiredType.getName() + "]: " + webRequest); + } + return nativeRequest; + } + + private T resolveNativeResponse(NativeWebRequest webRequest, Class requiredType) { + T nativeResponse = webRequest.getNativeResponse(requiredType); + if (nativeResponse == null) { + throw new IllegalStateException( + "Current response is not of type [" + requiredType.getName() + "]: " + webRequest); + } + return nativeResponse; + } + /** * 获取泛型参数类型 * @param methodParameter 参数