springboot接收多对象_spring mvc 接受多对象的处理

spring mvc感觉很好用,尤其是对接收对象参数的自动绑定非常简便,但对于同时传多个对象时有些困扰。同时项目并没有直接使用spring的formtag。从网上学来的多对象传值,自己优化了下,原文找不到出处了这里记录下。

首先声明一个注解类,用于对传值对象的声明

/**

* 处理spring mvc 对象绑定注解

* @author lee

*

*/

@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface RequestBean {

String value() default "_def_param_name";

}

然后是一个对WebArgumentResolver的实现类,对象参数绑定主要是这个类来处理

/**

* 对象传值的参数绑定处理

* @author lee

*

*/

public class BeanArgumentResolver implements WebArgumentResolver {

@SuppressWarnings("rawtypes")

public Object resolveArgument(MethodParameter param, NativeWebRequest request){

RequestBean requestBean = param.getParameterAnnotation(RequestBean.class);

try{

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 paramsMap = new HashMap();

Iterator itor = request.getParameterNames();

while (itor.hasNext()) {

String webParam = (String) itor.next();

String[] webValue = request.getParameterValues(webParam);

List webValueList = new ArrayList();

for(int i = 0;i

if(webValue[i]!=null&&!"".equals(webValue[i])){

webValueList.add(webValue[i]);

}

}

if (webParam.startsWith(_param)&&!webValueList.isEmpty()) {

paramsMap.put(webParam, webValueList.toArray(new String[webValueList.size()]));

}

}

BeanWrapper obj = new BeanWrapperImpl(object);

obj.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));

System.out.println(obj.findCustomEditor(Date.class, null).getAsText());

for (String propName : paramsMap.keySet()) {

Object 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);

}

}

return object;

}

}catch(Exception e){

e.printStackTrace();

}

return WebArgumentResolver.UNRESOLVED;

}

}

两个类写好后对mvc配置文件进行配置

接下来就是使用了mvc的controller方法如下

@RequestMapping(value="/saveEvent")

@ResponseBody

public AjaxResult saveEvent(@RequestBean Event event){

event =eventService.saveTemporaryEvent(event);

return AjaxResult.objectResult(event);

}

页面form表单代码

客户代码:客户电话:

————————————————————-分割线—————————————————————-

经过一段时间的使用,发现此方法对于传值有很多限制,复杂情况处理很不理想。特意补充官方推荐用法。

controller端直接使用注解声明

@Controller

@RequestMapping("/demo/formbean")

public class FormBeanController {

@Autowired

private FormBeanService formBeanService;

@InitBinder("formBean1")

public void initBinderFormBean1(WebDataBinder binder) {

binder.setFieldDefaultPrefix("formBean1.");

}

@InitBinder("formBean2")

public void initBinderFormBean2(WebDataBinder binder) {

binder.setFieldDefaultPrefix("formBean2.");

}

@RequestMapping("/save12")

@ResponseBody

public ModelAndView save12(FormBean1 formBean1, FormBean2 formBean2){

formBean2 = formBeanService.saveFromBean12(formBean1, formBean2);

ModelAndView mav = new ModelAndView();

mav.setViewName("redirect:/demo/formbean/edit12/"+formBean2.getId());

return mav;

}

}

html方式相差不大

FB1编号

FB1名称

FB2编号

FB2名称

提交

官方方法是用性更强,对于复杂情况如集合多级嵌套对象等处理完美,计较推荐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值