Spring Controller 如何对不同对象中相同的属性名注入不同的值


Spring MVC开发当中,有时候需要对不同对象中相同的属性名注入不同的值。通过下面自定义注解代码可解决问题。

 

新建注解类

package com.cdt.uums.spring.resolver;

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.cdt.uums.spring.resolver;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;

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;

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;
		}
	}
}


 

JSP页面

    <input name="committeeInfo.committeeName" id="committeeInfo.committeeName" value=""/>

Spring 控制器中可通过@RequestBean("committeeInfo") CommitteeInfo committeeInfo的方式接收值.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值