定义注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BodyParam {
String value() default "";
boolean require() default true;
}
自定义配置
@Configuration
public class BodyParamConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new BodyParamHandlerMethodArgumentResolver());
}
}
自定义处理器
public class BodyParamHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
private static final String KEY = "xxxx";
private static ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(BodyParam.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
BodyParam bodyParam = parameter.getParameterAnnotation(BodyParam.class);
JSONObject jsonObject = getJsonObject(webRequest);
String value = getParamName(parameter, bodyParam);
boolean require = bodyParam.require();
Object paramValue = getParamValue(jsonObject, value);
if (paramValue == null && require) {
throw new Exception("parameter[" + value + "]不能为空。");
}
if (paramValue == null) {
return null;
}
Class<?> classType = parameter.getParameterType();
if (paramValue.getClass().equals(JSONObject.class)) {
paramValue = OBJECT_MAPPER.readValue(paramValue.toString(), classType);
}
return paramValue;
}
private String getParamName(MethodParameter parameter, BodyParam bodyParam) {
String value = bodyParam.value();
if (StringUtils.isEmpty(value)) {
value = parameter.getParameterName();
}
return value;
}
private Object getParamValue(JSONObject jsonObject, String value) {
for (String key : jsonObject.keySet()) {
if (key.equalsIgnoreCase(value)) {
return jsonObject.get(key);
}
}
return null;
}
private JSONObject getJsonObject(NativeWebRequest webRequest) throws Exception {
String jsonBody = (String) webRequest.getAttribute(KEY, NativeWebRequest.SCOPE_REQUEST);
if (StringUtils.isEmpty(jsonBody)) {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
BufferedReader reader = request.getReader();
StringBuilder sb = new StringBuilder();
char[] buf = new char[1024];
int rd;
while ((rd = reader.read(buf)) != -1) {
sb.append(buf, 0, rd);
}
jsonBody = sb.toString();
if (StringUtils.isEmpty(jsonBody)) {
Map<String, String[]> params = request.getParameterMap();
Map tmp = new HashMap();
for (Map.Entry<String, String[]> param : params.entrySet()) {
if (param.getValue().length == 1) {
tmp.put(param.getKey(), param.getValue()[0]);
} else {
tmp.put(param.getKey(), param.getValue());
}
}
jsonBody = JSON.toJSONString(tmp);
}
webRequest.setAttribute(KEY, jsonBody, NativeWebRequest.SCOPE_REQUEST);
}
return JSONObject.parseObject(jsonBody);
}
}