Spring mvc 前端表单传递来的数据被后台的两个entity的相同名字的属性谁获取的问题

原文地址:http://blog.csdn.net/outlook008/article/details/8455710

当我们的input标签里面写着如下的代码是这样的   <input type='text' name='orderId' /> 会赋值到Springmvc的方法上的实体的orderId的属性上。

当然,后台拥有属性名为orderId的实体只有一个那还好说,如果是两个的话,那就有点麻烦。

当然也是有办法的。


加入一个实体的变量是order 里面含有orderId属性 worker实体也含有orderId属性。

我们可以这样写 <input type='text' name='order.orderId' />  和 <input type='text' name='worker.orderId' />

来区分是哪个实体的成员变量

我们先写一个自定义的注解

package com.thinkgem.jeesite.modules;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBean {
    String value() default "_def_param_name";
}


我们再为这个注解写一个解析器

package com.thinkgem.jeesite.modules;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebArgumentResolver;
import org.springframework.web.context.request.NativeWebRequest;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
public class BeanArgumentResolver implements WebArgumentResolver {

    @SuppressWarnings("rawtypes")
    public Object resolveArgument(MethodParameter param, NativeWebRequest request) throws Exception {
        RequestBean requestBean = param.getParameterAnnotation(RequestBean.class);

        if (requestBean != null) {
            String _param = requestBean.value();
            if (_param.equals("_def_param_name")) {
                _param = param.getParameterName();
            }
            Class clazz = param.getParameterType();
            Object object = clazz.newInstance();
            HashMap<String, String[]> paramsMap = new HashMap<String, String[]>();
            Iterator<String> itor = request.getParameterNames();
            while (itor.hasNext()) {
                String webParam = (String) itor.next();
                String[] webValue = request.getParameterValues(webParam);
                if (webParam.startsWith(_param)) {
                    paramsMap.put(webParam, webValue);
                }
            }
            BeanWrapper obj = new BeanWrapperImpl(object);
            //obj.findCustomEditor(paramClass, paramString)
            obj.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
            //WebDataBinder.
            System.out.println(obj.findCustomEditor(Date.class, null).getAsText());

            for (String propName : paramsMap.keySet()) {
                String[] propVals = paramsMap.get(propName);
                String[] props = propName.split("\\.");
                if (props.length == 2) {
                    obj.setPropertyValue(props[1], propVals);
                } else if (props.length == 3) {
                    Object tmpObj = obj.getPropertyValue(props[1]);
                    if (tmpObj == null)
                        obj.setPropertyValue(props[1], obj.getPropertyType(props[1]).newInstance());
                    obj.setPropertyValue(props[1] + "." + props[2], propVals);
                }

            }
            /*
             * Field[] fields = clazz.getDeclaredFields(); for(Field
             * field:fields){ obj.setPropertyValue(field.getName(),
             * paramsMap.get(_param +"."+field.getName())); }
             *
             * for(String porpName:paramsMap.keySet()){ String[] params =
             * paramsMap.get(porpName); if (null != params) { Object
             * field=obj.getPropertyValue(porpName.replaceFirst(_param+".",
             * "")); Class
             * clz=obj.getPropertyType(porpName.replaceFirst(_param+".", ""));
             * System.out.println(porpName.replaceFirst(_param+".",
             * "")+":"+field+" "+clz); if(field==null){
             * //field=obj.getPropertyType(porpName.replaceFirst(_param+".",
             * "")).newInstance(); }
             * obj.setPropertyValue(porpName.replaceFirst(_param+".", ""),
             * params); } }
             */
            /*
             * Method[] methods = clazz.getMethods(); for (Method m : methods) {
             * Class[] parClazzs = m.getParameterTypes(); String methodName =
             * m.getName(); if (parClazzs.length == 1 &&
             * methodName.startsWith("set")) {
             *
             * String[] params = paramsMap.get(_param +
             * methodName.toLowerCase().replace("set", "."));
             *
             * if (parClazzs[0].equals(String.class)) { if (null != params) {
             * m.invoke(object, new Object[] { params[0] }); } } else if
             * (parClazzs[0].equals(String[].class)) { if (null != params) {
             * m.invoke(object, new Object[] { params }); } } }
             *
             * }
             */
            return object;
        } else {
            return WebArgumentResolver.UNRESOLVED;
        }
    }
}

在Spring的xml配置文件上加上一些xml片段


		<mvc:argument-resolvers>
			<bean class="com.thinkgem.jeesite.modules.BeanArgumentResolver"/>
		</mvc:argument-resolvers>


在我们的Controller中就可以这样写得以区分

	@RequestMapping(value = {"hehe", ""})
	public String hehe(@RequestBean("order") Order order, @RequestBean("workerDepositInfo") WorkerDepositInfo workerDepositInfo) {

	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值