因前端整体传参时,参数名都不是驼峰写法,类似 music_name,music_type,
因此在后台需要加上@RequestParam("music_name")String musicName 来接收,
但是后台中是用bean来接收的
@RequestMapping(value = "/test",method = {RequestMethod.POST})
@ResponseBody
public void test( MusicInfo musicinfo) {
System.out.println("进来了" + musicinfo.getMusicName());
}
因此需要自定义去将参数转换成可以识别的 如果前端传music_name,
我们处理成musicName并添加到MusicInfo实体中,完成参数的解析.
自定义参数转换到实体bean并实现HandlerMethodArgumentResolver
import org.springframework.beans.BeanUtils;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import java.lang.reflect.Field;
import java.util.Iterator;
/**
* @author qi.liu
* @create 2018-08-09 下午 2:21
* @desc 描述:
**/
public class TestDiyRequestParamResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(DiyRequestParam.class);
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
//生成结果的对象
Object resultObject = BeanUtils.instantiate(parameter.getParameterType());
//未经过处理的字段名 music_name
String sourceTemp;
//经过处理的字段名 musicName
String executeTemp;
//传参的值 例如 music_name=asdmsakdlasjd 的value
String[] values;
//得到bean中的方法
Field[] frr = parameter.getParameterType().getDeclaredFields();
for (Iterator itr = webRequest.getParameterNames(); itr
.hasNext(); ) {
sourceTemp = itr.next();
executeTemp = sourceTemp;
// music_name -> musicName
while (executeTemp.indexOf("_") > 0) {
Integer indexOf = executeTemp.indexOf("_");
executeTemp = executeTemp.replaceFirst("_", "");
executeTemp = executeTemp.substring(0, indexOf) + executeTemp.substring(indexOf, indexOf + 1).toUpperCase() + executeTemp.substring(indexOf + 1, executeTemp.length());
}
//去赋值
for (int i = 0; i < frr.length; i++) {
frr[i].setAccessible(true);
if (executeTemp.equals(frr[i].getName())) {
values = webRequest.getParameterValues(sourceTemp);
frr[i].set(resultObject, values[0]);
}
}
}
return resultObject;
}
}
自定义注解 DiyRequestParam
/**
* @author qi.liu
* @create 2018-08-09 下午 2:22
* @desc 描述:
**/
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DiyRequestParam {
String value() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
在spring-mvc.xml中加入自定义的 TestDiyRequestParamResolver
在参数前加上
@RequestMapping(value = "/test",method = {RequestMethod.POST})
@ResponseBody
public void test(@DiyRequestParam MusicInfo musicinfo) {
System.out.println("进来了" + musicinfo.getMusicName());
}
看下效果
后台接收到