mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
优化参数绑定
This commit is contained in:
@@ -4,8 +4,8 @@ import com.gitee.sop.servercommon.annotation.ApiAbility;
|
|||||||
import com.gitee.sop.servercommon.annotation.ApiMapping;
|
import com.gitee.sop.servercommon.annotation.ApiMapping;
|
||||||
import com.gitee.sop.servercommon.bean.ServiceConfig;
|
import com.gitee.sop.servercommon.bean.ServiceConfig;
|
||||||
import com.gitee.sop.servercommon.bean.ServiceContext;
|
import com.gitee.sop.servercommon.bean.ServiceContext;
|
||||||
|
import com.gitee.sop.servercommon.util.OpenUtil;
|
||||||
import org.springframework.core.PriorityOrdered;
|
import org.springframework.core.PriorityOrdered;
|
||||||
import org.springframework.core.annotation.AnnotationUtils;
|
|
||||||
import org.springframework.util.StringValueResolver;
|
import org.springframework.util.StringValueResolver;
|
||||||
import org.springframework.web.servlet.mvc.condition.RequestCondition;
|
import org.springframework.web.servlet.mvc.condition.RequestCondition;
|
||||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
|
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
|
||||||
@@ -26,7 +26,7 @@ public class ApiMappingHandlerMapping extends RequestMappingHandlerMapping imple
|
|||||||
String sopMvc = System.getProperty(ServiceContext.SOP_MVC);
|
String sopMvc = System.getProperty(ServiceContext.SOP_MVC);
|
||||||
boolean isMvc = sopMvc != null;
|
boolean isMvc = sopMvc != null;
|
||||||
ApiMapping apiMapping = method.getAnnotation(ApiMapping.class);
|
ApiMapping apiMapping = method.getAnnotation(ApiMapping.class);
|
||||||
ApiAbility apiAbility = method.getAnnotation(ApiAbility.class);
|
ApiAbility apiAbility = OpenUtil.getAnnotationFromMethodOrClass(method, ApiAbility.class);
|
||||||
StringValueResolver valueResolver = null;
|
StringValueResolver valueResolver = null;
|
||||||
if (apiMapping != null || apiAbility != null) {
|
if (apiMapping != null || apiAbility != null) {
|
||||||
valueResolver = isMvc ? stringValueResolverMVC : stringValueResolver;
|
valueResolver = isMvc ? stringValueResolverMVC : stringValueResolver;
|
||||||
@@ -53,7 +53,7 @@ public class ApiMappingHandlerMapping extends RequestMappingHandlerMapping imple
|
|||||||
permission = apiMapping.permission();
|
permission = apiMapping.permission();
|
||||||
needToken = apiMapping.needToken();
|
needToken = apiMapping.needToken();
|
||||||
} else {
|
} else {
|
||||||
ApiAbility apiAbility = this.findApiAbilityAnnotation(method);
|
ApiAbility apiAbility = OpenUtil.getAnnotationFromMethodOrClass(method, ApiAbility.class);
|
||||||
if (apiAbility != null) {
|
if (apiAbility != null) {
|
||||||
version = apiAbility.version();
|
version = apiAbility.version();
|
||||||
ignoreValidate = apiAbility.ignoreValidate();
|
ignoreValidate = apiAbility.ignoreValidate();
|
||||||
@@ -88,12 +88,4 @@ public class ApiMappingHandlerMapping extends RequestMappingHandlerMapping imple
|
|||||||
return new ApiMappingRequestCondition(apiMappingInfo);
|
return new ApiMappingRequestCondition(apiMappingInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ApiAbility findApiAbilityAnnotation(Method method) {
|
|
||||||
ApiAbility apiAbility = method.getAnnotation(ApiAbility.class);
|
|
||||||
if (apiAbility == null) {
|
|
||||||
Class<?> controllerClass = method.getDeclaringClass();
|
|
||||||
apiAbility = AnnotationUtils.findAnnotation(controllerClass, ApiAbility.class);
|
|
||||||
}
|
|
||||||
return apiAbility;
|
|
||||||
}
|
|
||||||
}
|
}
|
@@ -21,7 +21,6 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||||
import org.springframework.web.multipart.MultipartRequest;
|
import org.springframework.web.multipart.MultipartRequest;
|
||||||
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
|
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
|
||||||
import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor;
|
|
||||||
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver;
|
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver;
|
||||||
|
|
||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
@@ -40,7 +39,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
@@ -85,9 +83,7 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver {
|
|||||||
@Override
|
@Override
|
||||||
public boolean supportsParameter(MethodParameter methodParameter) {
|
public boolean supportsParameter(MethodParameter methodParameter) {
|
||||||
// 是否有注解
|
// 是否有注解
|
||||||
boolean hasAnnotation = methodParameter.hasMethodAnnotation(ApiMapping.class)
|
if (hasApiAnnotation(methodParameter)) {
|
||||||
|| methodParameter.hasMethodAnnotation(ApiAbility.class);
|
|
||||||
if (hasAnnotation) {
|
|
||||||
openApiParams.add(methodParameter);
|
openApiParams.add(methodParameter);
|
||||||
}
|
}
|
||||||
Class<?> paramType = methodParameter.getParameterType();
|
Class<?> paramType = methodParameter.getParameterType();
|
||||||
@@ -116,6 +112,11 @@ public class ApiArgumentResolver implements SopHandlerMethodArgumentResolver {
|
|||||||
return !exclude;
|
return !exclude;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasApiAnnotation(MethodParameter methodParameter) {
|
||||||
|
return methodParameter.hasMethodAnnotation(ApiMapping.class)
|
||||||
|
|| OpenUtil.getAnnotationFromMethodOrClass(methodParameter.getMethod(), ApiAbility.class) != null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object resolveArgument(
|
public Object resolveArgument(
|
||||||
MethodParameter methodParameter
|
MethodParameter methodParameter
|
||||||
|
@@ -5,10 +5,13 @@ import com.alibaba.fastjson.JSONObject;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.core.annotation.AnnotationUtils;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.util.DigestUtils;
|
import org.springframework.util.DigestUtils;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -90,4 +93,22 @@ public class OpenUtil {
|
|||||||
String serverSign = DigestUtils.md5DigestAsHex(source.getBytes());
|
String serverSign = DigestUtils.md5DigestAsHex(source.getBytes());
|
||||||
return serverSign.equals(sign);
|
return serverSign.equals(sign);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在方法或方法对应的类上找指定的注解
|
||||||
|
* @param method 方法
|
||||||
|
* @param annotationClass 指定的注解
|
||||||
|
* @param <T>
|
||||||
|
* @return 返回指定注解,没有返回null
|
||||||
|
*/
|
||||||
|
public static <T extends Annotation> T getAnnotationFromMethodOrClass(Method method, Class<T> annotationClass) {
|
||||||
|
if (method == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
T annotation = AnnotationUtils.findAnnotation(method, annotationClass);
|
||||||
|
if (annotation == null) {
|
||||||
|
annotation = AnnotationUtils.findAnnotation(method.getDeclaringClass(), annotationClass);
|
||||||
|
}
|
||||||
|
return annotation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,32 @@
|
|||||||
|
package com.gitee.sop.storyweb.controller;
|
||||||
|
|
||||||
|
import com.gitee.sop.servercommon.annotation.ApiAbility;
|
||||||
|
import com.gitee.sop.storyweb.controller.param.StoryParam;
|
||||||
|
import com.gitee.sop.storyweb.controller.result.StoryResult;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付宝服务端,假设签名验证通过后,到达这里进行具体的业务处理。
|
||||||
|
*
|
||||||
|
* @author tanghc
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@Slf4j
|
||||||
|
// 注解放在这里,表示类中的方法都具备接口开放能力
|
||||||
|
@ApiAbility
|
||||||
|
public class AlipayController2 {
|
||||||
|
|
||||||
|
// http://localhost:2222/getStory44
|
||||||
|
// 遗留接口具备开放平台能力
|
||||||
|
@PostMapping("/getStory44")
|
||||||
|
public StoryResult getStory22(@RequestBody StoryParam param) {
|
||||||
|
StoryResult story = new StoryResult();
|
||||||
|
story.setId(1L);
|
||||||
|
story.setName("遗留接口44,param:" + param);
|
||||||
|
return story;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user