@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return true;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
HttpServletRequest httpServletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
// 处理get请求
if ("GET".equals(httpServletRequest.getMethod())) {
return getRequestHandle(methodParameter, nativeWebRequest);
}
return postRequestHandle(methodParameter, nativeWebRequest);
}
/**
* 处理get请求
*/
private Object getRequestHandle(MethodParameter methodParameter, NativeWebRequest nativeWebRequest)
throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<?> parameterType = methodParameter.getParameterType();
String parameter = nativeWebRequest.getParameter(methodParameter.getParameterName());
if (parameterType == String.class) {
return parameter;
}
if (parameterType.isPrimitive()) {
return JSON.parseObject(parameter, parameterType);
}
Object instance = parameterType.newInstance();
Iterator<String> parameterNames = nativeWebRequest.getParameterNames();
while (parameterNames.hasNext()) {
String attrName = parameterNames.next();
String attrValue = nativeWebRequest.getParameter(attrName);
Class attrType = getAttrClassType(parameterType, attrName);
Method setterMethod = parameterType.getMethod(getSetterName(attrName), attrType);
if (attrType.isPrimitive()) {
setterMethod.invoke(instance, JSON.parseObject(attrValue, attrType));
continue;
}
setterMethod.invoke(instance, attrValue);
}
return instance;
}
/**
* 处理宝武基座转发的请求
*/
private Object postRequestHandle(MethodParameter methodParameter, NativeWebRequest nativeWebRequest) {
// 宝武基座转发数据从data中获取
String data = nativeWebRequest.getParameter("data");
// 得到参数的类型
Class<?> parameterType = methodParameter.getParameterType();
// 基本数据类型
if (parameterType.isPrimitive() || parameterType == String.class) {
JSONObject jsonObject = JSON.parseObject(data);
String parameterName = methodParameter.getParameterName();
Object parameterValue = jsonObject.get(parameterName);
if (parameterValue == null) {
log.error("参数丢失, 缺少->" + parameterName + "参数。完整请求数据->" + data);
}
return parameterValue;
// 包装类
} else {
return JSON.parseObject(data, parameterType);
}
}
/**
* 根据参数名称获取set方法名
*/
private String getSetterName(String attrName) {
String firstLetter = attrName.substring(0, 1);
firstLetter = firstLetter.toUpperCase();
return "set" + firstLetter + attrName.substring(1, attrName.length());
}
/**
* 获取类中某个属性的类型
*/
private Class getAttrClassType(Class classType, String attrName) {
Field[] fields = classType.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.getName().equals(attrName)) {
return field.getType();
}
}
log.error("类->" + classType.getName() + "中没有名称为->" + attrName + "的属性");
return null;
}
上面实现的功能是:当请求方式为post请求时,将body里的请求参数进行解体;
请求数据格式:
解析后传入控制层方法时的数据格式:dataItem:CWS2_LargePool
相当于去掉了data这一层
list类型时:"list":["a","b","c"]