|
|
|
@ -10,7 +10,6 @@ import com.gitee.sop.servercommon.util.OpenUtil; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.springframework.core.MethodParameter; |
|
|
|
|
import org.springframework.http.HttpMethod; |
|
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
|
import org.springframework.util.ClassUtils; |
|
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
|
import org.springframework.web.bind.support.WebDataBinderFactory; |
|
|
|
@ -40,8 +39,10 @@ import java.time.ZoneId; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Locale; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.Objects; |
|
|
|
|
import java.util.TimeZone; |
|
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 解析request参数中的业务参数,绑定到方法参数上 |
|
|
|
@ -51,11 +52,14 @@ import java.util.TimeZone; |
|
|
|
|
@Slf4j |
|
|
|
|
public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver { |
|
|
|
|
|
|
|
|
|
private Map<MethodParameter, HandlerMethodArgumentResolver> argumentResolverCache = new ConcurrentHashMap<>(256); |
|
|
|
|
|
|
|
|
|
private ParamValidator paramValidator = new ServiceParamValidator(); |
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
private static Class<?> pushBuilder; |
|
|
|
|
|
|
|
|
|
private RequestMappingHandlerAdapter requestMappingHandlerAdapter; |
|
|
|
|
|
|
|
|
|
static { |
|
|
|
|
try { |
|
|
|
|
pushBuilder = ClassUtils.forName("javax.servlet.http.PushBuilder", |
|
|
|
@ -69,7 +73,7 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver { |
|
|
|
|
@Override |
|
|
|
|
public void setRequestMappingHandlerAdapter(RequestMappingHandlerAdapter requestMappingHandlerAdapter) { |
|
|
|
|
List<HandlerMethodArgumentResolver> argumentResolversNew = new ArrayList<>(64); |
|
|
|
|
// 先加自己
|
|
|
|
|
// 先加自己,确保在第一个位置
|
|
|
|
|
argumentResolversNew.add(this); |
|
|
|
|
HandlerMethodArgumentResolver lastOne = null; |
|
|
|
|
for (HandlerMethodArgumentResolver argumentResolver : Objects.requireNonNull(requestMappingHandlerAdapter.getArgumentResolvers())) { |
|
|
|
@ -84,6 +88,7 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver { |
|
|
|
|
argumentResolversNew.add(lastOne); |
|
|
|
|
} |
|
|
|
|
requestMappingHandlerAdapter.setArgumentResolvers(argumentResolversNew); |
|
|
|
|
this.requestMappingHandlerAdapter = requestMappingHandlerAdapter; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@ -122,15 +127,30 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { |
|
|
|
|
public Object resolveArgument( |
|
|
|
|
MethodParameter methodParameter |
|
|
|
|
, ModelAndViewContainer modelAndViewContainer |
|
|
|
|
, NativeWebRequest nativeWebRequest |
|
|
|
|
, WebDataBinderFactory webDataBinderFactory |
|
|
|
|
) throws Exception { |
|
|
|
|
Object paramObj = this.getParamObject(methodParameter, nativeWebRequest); |
|
|
|
|
if (paramObj != null) { |
|
|
|
|
// JSR-303验证
|
|
|
|
|
paramValidator.validateBizParam(paramObj); |
|
|
|
|
return paramObj; |
|
|
|
|
} else { |
|
|
|
|
HandlerMethodArgumentResolver resolver = getOtherArgumentResolver(methodParameter); |
|
|
|
|
if (resolver != null) { |
|
|
|
|
return resolver.resolveArgument( |
|
|
|
|
methodParameter |
|
|
|
|
, modelAndViewContainer |
|
|
|
|
, nativeWebRequest |
|
|
|
|
, webDataBinderFactory |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -202,6 +222,29 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver { |
|
|
|
|
return request instanceof MultipartRequest; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取其它的参数解析器 |
|
|
|
|
* |
|
|
|
|
* @param parameter 业务参数 |
|
|
|
|
* @return 返回合适参数解析器,没有返回null |
|
|
|
|
*/ |
|
|
|
|
protected HandlerMethodArgumentResolver getOtherArgumentResolver(MethodParameter parameter) { |
|
|
|
|
HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter); |
|
|
|
|
if (result == null) { |
|
|
|
|
List<HandlerMethodArgumentResolver> argumentResolvers = this.requestMappingHandlerAdapter.getArgumentResolvers(); |
|
|
|
|
for (HandlerMethodArgumentResolver methodArgumentResolver : argumentResolvers) { |
|
|
|
|
if (methodArgumentResolver instanceof SopHandlerMethodArgumentResolver) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (methodArgumentResolver.supportsParameter(parameter)) { |
|
|
|
|
result = methodArgumentResolver; |
|
|
|
|
this.argumentResolverCache.put(parameter, result); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setParamValidator(ParamValidator paramValidator) { |
|
|
|
|
this.paramValidator = paramValidator; |
|
|
|
|