importcom.fasterxml.jackson.databind.ObjectMapper;importgraspyun.weshop.manage.filter.BufferedServletRequestWrapper;importgraspyun.weshop.manage.support.annotation.BodyParam;importgraspyun.weshop.manage.support.exceptions.SysException;importorg.springframework.core.MethodParameter;importorg.springframework.stereotype.Component;importorg.springframework.web.bind.MissingServletRequestParameterException;importorg.springframework.web.bind.support.WebDataBinderFactory;importorg.springframework.web.context.request.NativeWebRequest;importorg.springframework.web.method.support.HandlerMethodArgumentResolver;importorg.springframework.web.method.support.ModelAndViewContainer;importjava.lang.reflect.Array;importjava.util.List;importjava.util.Map;/*** 处理 @BodyParam 注解
*@authoryangyxd
* @date 2020.08.18 16:03*/@Componentpublic class BodyParamResolver implementsHandlerMethodArgumentResolver {
@Overridepublic booleansupportsParameter(MethodParameter methodParameter) {return methodParameter.hasParameterAnnotation(BodyParam.class);
}
@Overridepublic Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throwsException {
BufferedServletRequestWrapper request=(BufferedServletRequestWrapper) nativeWebRequest.getNativeRequest();
Map json=request.getContentBody();
BodyParam p= methodParameter.getParameterAnnotation(BodyParam.class);
Object v= json == null ? null: json.get(p.value().toLowerCase());if (v == null) {if(p.required()) {if(p.message().isEmpty())throw newMissingServletRequestParameterException(p.value(), methodParameter.getParameterType().getTypeName());throw newSysException(p.message());
}return null;
}final Class> pType =methodParameter.getParameterType();final Class> vType =v.getClass();if (pType ==vType)returnv;if (pType == String.class) {if (v instanceof Map || v instanceof List || v instanceofArray) {
ObjectMapper mapper= newObjectMapper();returnmapper.writeValueAsString(v);
}if (v instanceofNumber) {returnv.toString();
}
}else if (v instanceofNumber) {if (pType == Long.class)return((Number) v).longValue();if (pType == Short.class)return((Number) v).shortValue();if (pType == Byte.class)return((Number) v).byteValue();if (pType == Double.class)return((Number) v).doubleValue();if (pType == Float.class)return((Number) v).floatValue();
}returnv;
}
}