springMvc中自定義bean轉換接收前台傳的參數


轉載:https://blog.csdn.net/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());
}
 

 

看下效果

 

后台接收到

 


————————————————
版權聲明:本文為CSDN博主「變味的麥芽糖」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013476435/article/details/81538099


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM