您的位置:首页 > 编程语言 > Java开发

springboot重写SpringMVC请求参数装载

2018-02-02 11:11 1631 查看
详细原理解析参考恒宇少年:https://segmentfault.com/a/1190000011406515

本文只做将请求参数名转下换线的实现,数据装载的实现使用反射,让代码更为简练。

1.使用自定义注解:

/**
* 实体映射注解
* 配置该注解的参数会使用UnderlineToCamelArgumentResolver类完成装载
*/
@Target(value = ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParameterModel {
}


2.实现HandlerMethodArgumentResolver接口:

/**
* 将请求参数带有下划线转驼峰命名
*/
public class UnderlineToCamelArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(ParameterModel.class);
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return handleParameterNames(parameter, webRequest);
}

private Object handleParameterNames(MethodParameter parameter, NativeWebRequest webRequest) {
Object obj = BeanUtils.instantiate(parameter.getParameterType());
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(obj);
Iterator<String> paramNames = webRequest.getParameterNames();
while (paramNames.hasNext()) {
String paramName = paramNames.next();
Object o = webRequest.getParameter(paramName);
wrapper.setPropertyValue(underLineToCamel(paramName), o);
}
return obj;
}

private String underLineToCamel(String source) {
Matcher matcher = Pattern.compile("_(\\w)").matcher(source);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
}


3.使用:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: