过了这么久,又重新把博客拾起来了

来上海工作也已经有将近两周的时间了,

今天在整理项目的时候,遇到了一个关于参数注入的问题

背景:

我的开发前台用的是extjs4,在对后台spring mvc提交表单的时候,出现了400错误,开始我就想400主要就是由于参数注入类型不匹配的问题,我的formdata的格式是这样的

  1. uniqueId:
    1
  2. invoiceIssueItems:
    [{"uniqueId":1,"createAccount":"root","createDate":"2017-12-11 14:26:28","modifyAccount":"root","modifyDate":"2017-12-11 14:26:28","ownerDepartmentCode":"1000","ownerDepartmentName":"","protectLevel":0,"invoiceID":1,"itemName":"rfid扫描器","itemType":"手持机","itemUnit":"个","itemCount":3,"itemUnitPrice":12,"totalPrice":45,"taxRate":0.12,"totalTax":23.12,"taxandPrice":34,"invoiceNoRight":"B23447","invoiceDate":"2017-12-11 14:26:28","clientName":"解"},{"uniqueId":2,"createAccount":"root","createDate":"2017-12-11 14:26:33","modifyAccount":"root","modifyDate":"2017-12-11 14:26:33","ownerDepartmentCode":"1000","ownerDepartmentName":"","protectLevel":0,"invoiceID":1,"itemName":"iphone x","itemType":"手机","itemUnit":"个","itemCount":4,"itemUnitPrice":12,"totalPrice":45,"taxRate":0.12,"totalTax":222.12,"taxandPrice":100,"invoiceNoRight":"B23447","invoiceDate":"2017-12-11 14:26:33","clientName":"小红"}]
  3. contractNo:
    AS6351
  4. invoiceNoLeft:
    A7834
  5. invoiceDate:
    2017-12-11 14:26:21
  6. companyBankName:
    工商银行
  7. 我对应的实体是

  8. invoice{

  9. 基本字段;

  10. List<invoiceIssueItem> invoiceIssueItem;                            ///伪代码希望多多见谅

  11. }

  12. 第一次出现400,我从网上找到是因为日期格式不对,不能format,网上有很多解决方案。我这里就不写了

  13. 第二次出现400,我也找到是因为List<invoiceIssueItem>数据注入不进去,开始我还以为是里面的字段不匹配造成的,因此我特地将每个字段都尝试了一下,但是效果还是那样,我为了找出到底是哪个字段的问题,我将spring的log4j

  14. 的日记级别调到了debug级别,最后也只是看到Object invoice   的字段invoiceIssueItems 拒绝注入。

  15. 最终的还是解决了这个问题,原来spring mvc对这种嵌套的复杂对象是不可以自动注入的,这种获取表单复杂类型的数据有两种方法

  16. 1.第一种比较简单,就是给提交的方法一个HttpServletRequest的request用request.getParamers("fieldname");获得

  17. 2.第二种要复杂一点,spring mvc对这种复杂数据类型提供了一种自定义注入类型,在改类初始化时绑定数据有一个@InitBinder注解,该注解可以实现在spring mvc获取表单的时候,来执行自己定义的注入方法

  18. @InitBinder
     public void initBinder(WebDataBinder binder) {
      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
      binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));

    binder.registerCustomEditor(List.class, "invoiceIssueItem", new CustomItemsEditor());
     }

  19. 第一个是处理时间类型,由spring mvc提供,第二种 处理自定义类型CustomItemsEditor()是一个自定义类,该类继承了PropertiesEditor实现类,该类又实现了PropertyEditor接口

  20. PropertiesEditor类的方法在网上也比较容易找到,我这里要用的是其中的setAsTest(String json)方法
     
     public class CustomItemsEditor extends PropertiesEditor {
       public void setAsText(String str) {   
        List<ClientContact> lists = JsonHelper.getObjectsFromJson(str, ClientContact.class);   
        super.setValue(lists);
       }
     };

    在这里将页面传进来的值,经过自定义的格式化,再注入到bean中

  21. 我用的是jackson包来讲json数据转化成List<object>

  22. 方法在下面

  23. public static <T> List<T> getObjectsFromJson(String json, Class<T> myClass) {
      if(json == null) {
       return new ArrayList<T>();
      }
      JSONArray jsonArray = (JSONArray)JSONSerializer.toJSON(json);
      JsonConfig jsonConfig = new JsonConfig();
      jsonConfig.setArrayMode(JsonConfig.MODE_LIST);
      jsonConfig.setRootClass(myClass);
      List<T> filters = (List<T>)JSONSerializer.toJava(jsonArray, jsonConfig);
      return filters;
     }

在接下来我会尽量多的详细的记录我在学习中遇到的问题,如果转载请注明出处

小白菜一枚,希望各位大神不吝赐教------------------------------------------------

spring mvc 复杂参数注入的更多相关文章

  1. spring mvc绑定参数之 类型转换 有三种方式:

    spring mvc绑定参数之类型转换有三种方式: 1.实体类中加日期格式化注解(上次做项目使用的这种.简单,但有缺点,是一种局部的处理方式,只能在本实体类中使用.方法三是全局的.) @DateTim ...

  2. Spring MVC接收参数(Map,List,JSON,Date,2个Bean)(记录一次面试惨状)

    题目Spring MVC 接收参数 MapListDate2个BeanJSON Spring MVC接收参数 -Map Spring MVC接收参数 -List Spring MVC接收参数 -dat ...

  3. Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器

    请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...

  4. Spring MVC请求参数绑定

    所谓请求参数绑定,就是在控制器方法中,将请求参数绑定到方法参数上 @RequestParam 绑定单个请求参数到方法参数上 @RequestParam("id") Integer ...

  5. spring mvc给参数起别名

    需求: 将http报文请求(保护body和url)中的参数传递给Controller时支持使用别名. 举例: 下面两条请求报文的结果是一致的. http://example.com/foo?jobTy ...

  6. Spring MVC处理参数Convert

    Springmvc.xml 配置convert,xml中配置多个相同的泛型时,xml里配置的convert会从上到下挨个执行. <!-- 配置注解驱动,并配置convert --> < ...

  7. Spring MVC Action参数类型 List集合类型(简单案例)

    题目:定义一个员工实体(Employee),实现批量添加员工功能,在表单中可以一次添加多个员工,数据可以不持久化 1,新建一个项目 2, 然后选择Maven框架选择 maven-archetype-w ...

  8. Spring MVC请求参数绑定 自定义类型转化 和获取原声带额servlet request response信息

    首先还在我们的框架的基础上建立文件 在domian下建立Account实体类 import org.springframework.stereotype.Controller; import org. ...

  9. Spring Mvc 传递参数要controller出现了400,日期参数全局处理,格式化yyyy-MM-dd 和yyyy-MM-dd HH:mm:ss

    描述:今天做一个业务操作的时候,ajax传递参数要controller出现了400,前后台都没有报错. 问题:springmvc 在接收日期类型参数时,如不做特殊处理 会出现400语法格式错误 解决: ...

随机推荐

  1. oracle实用基础

    Oracle修改字段名 alter table 表名 rename column 旧字段名 to 新字段名例子:alter table T_STUDENT rename column NAME to ...

  2. 我的第一个python web开发框架(15)——公司介绍编辑功能

    完成登录以后,就会进入后台管理系统的主界面,因为这个是小项目,所以导航菜单全部固化在HTML中,不能修改.一般后台还会有一个欢迎页或关键数据展示的主页面,小项目也没有多大的必要,所以登录后直接进入公司 ...

  3. hadoop2的mapreduce操作hbase数据

    1.从hbase中取数据,再把计算结果插入hbase中 package com.yeliang; import java.io.IOException; import org.apache.hadoo ...

  4. Host文件简介

    摘抄自:http://www.cnblogs.com/zgx/archive/2009/03/10/1408017.html.百度百科:hosts文件 很奇怪有很多人不知道Hosts是什么东西.在网络 ...

  5. linux dig 命令

    dig 命令主要用来从 DNS 域名服务器查询主机地址信息. 查询单个域名的 DNS 信息 dig 命令最典型的用法就是查询单个主机的信息. $ dig baidu.com dig 命令默认的输出信息 ...

  6. HTML 3秒一换轮播(鼠标选中旋转停止定时) 动画案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期

    前文回顾 riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法 riot.js教程[一]简介 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可 ...

  8. MUI框架开发HTML5手机APP(一)--搭建第一个手机APP

      前  言 JRedu 随着HTML5的不断发展,移动开发成为主流趋势!越来越多的公司开始选择使用HTML5开发手机APP,而随着手机硬件设备配置的不断提升,各种开发框架的不断优化,也使着H5开发的 ...

  9. cocoaPods打包的静态库

    cocoaPods管理自己的静态库供其它人下载使用(直接使用上一篇用cocoaPod打包的静态库)(1) 创建github仓库 (2) 下载仓库到本地 (3) 将打包好的framework放到项目中 ...

  10. TensorFlow(三)---------正则化

    TensorFlow正则化经常被用于Deep-Learn中,泛化数据模型,解决过拟合问题.再深度学习网络只有在有足够大的数据集时才能产生惊人的学习效果.当数据量不够时,过拟合的问题就会经常发生.然而, ...