springboot GET请求参数不能使用@RequestBody接收解决方案

问题:@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(对象)


image

二、创建自定义参数

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());
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容