问题:@RequestBody接受对象只能只能接受POST或着PUT请求的对象,GET请求在url上的复杂对象并不能接收。
解决方案:创建自定义参数解析器解析参数
实现:
一、前端发起请求:
/rest/user?currentPage=1&pageSize=100&searchConditions=%5B%5D&sortConditions=%5B%7B%22field%22%3A%22userName%22%2C%22isASC%22%3Atrue%7D%5D
格式 参数=JSON.stringify(对象)
二、创建自定义参数
1、创建注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UrlRequestBody {
}
2、创建UrlRequestBody参数解析器
@Log
public class UrlRequestBodyMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(UrlRequestBody.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Map<String, String[]> parameterMap = ((ServletWebRequest) webRequest).getRequest().getParameterMap();
if (parameterMap == null) {
return null;
}
Iterator<String> keyIterator = parameterMap.keySet().iterator();
String key;
StringBuffer json = new StringBuffer();
json.append("{");
boolean isFirst = true;
while (keyIterator.hasNext()) {
key = keyIterator.next();
String[] strings = parameterMap.get(key);
if (strings.length > 1) {
log.warning("There can only be one parameter " + key + "!");
}
if(isFirst){
isFirst = false;
}else {
json.append(",");
}
json.append("\"");
json.append(key);
json.append("\"");
json.append(":");
json.append(strings[0]);
}
json.append("}");
Class<?> parameterType = parameter.getParameterType();
final Object o = JsonUtil.json2Object(json.toString(), parameterType);
return o;
}
}
3、配置Spring Mvc 是参数解析器生效
@Configuration
public class SpringMvcConfigurer implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new UrlRequestBodyMethodArgumentResolver());
}
}