Spring mvc 自定义参数接收到实体bean中

因前端整体传参时,参数名都不是驼峰写法,类似 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());
    }

看下效果

后台接收到

猜你喜欢

转载自blog.csdn.net/u013476435/article/details/81538099