2018年08月09日 15:53:48 变味的麦芽糖 阅读数 5222
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/u013476435/article/details/81538099
因前端整体传参时,参数名都不是驼峰写法,类似 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<String> 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
-
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
-
<property name="customArgumentResolvers">
-
<list>
-
<bean class="net.okdi.o2o.beautiful.controller.TestDiyRequestParamResolver">
-
</bean>
-
</list>
-
</property>
-
</bean>
在参数前加上
-
@RequestMapping(value = "/test",method = {RequestMethod.POST})
-
@ResponseBody
-
public void test(@DiyRequestParam MusicInfo musicinfo) {
-
System.out.println("进来了" + musicinfo.getMusicName());
-
}
看下效果
后台接收到