spring mvc 复杂参数注入
过了这么久,又重新把博客拾起来了
来上海工作也已经有将近两周的时间了,
今天在整理项目的时候,遇到了一个关于参数注入的问题
背景:
我的开发前台用的是extjs4,在对后台spring mvc提交表单的时候,出现了400错误,开始我就想400主要就是由于参数注入类型不匹配的问题,我的formdata的格式是这样的
- uniqueId:1
- 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":"小红"}]
- contractNo:AS6351
- invoiceNoLeft:A7834
- invoiceDate:2017-12-11 14:26:21
- companyBankName:工商银行
我对应的实体是
invoice{
基本字段;
List<invoiceIssueItem> invoiceIssueItem; ///伪代码希望多多见谅
}
第一次出现400,我从网上找到是因为日期格式不对,不能format,网上有很多解决方案。我这里就不写了
第二次出现400,我也找到是因为List<invoiceIssueItem>数据注入不进去,开始我还以为是里面的字段不匹配造成的,因此我特地将每个字段都尝试了一下,但是效果还是那样,我为了找出到底是哪个字段的问题,我将spring的log4j
的日记级别调到了debug级别,最后也只是看到Object invoice 的字段invoiceIssueItems 拒绝注入。
最终的还是解决了这个问题,原来spring mvc对这种嵌套的复杂对象是不可以自动注入的,这种获取表单复杂类型的数据有两种方法
1.第一种比较简单,就是给提交的方法一个HttpServletRequest的request用request.getParamers("fieldname");获得
2.第二种要复杂一点,spring mvc对这种复杂数据类型提供了一种自定义注入类型,在改类初始化时绑定数据有一个@InitBinder注解,该注解可以实现在spring mvc获取表单的时候,来执行自己定义的注入方法
- @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());
} 第一个是处理时间类型,由spring mvc提供,第二种 处理自定义类型CustomItemsEditor()是一个自定义类,该类继承了PropertiesEditor实现类,该类又实现了PropertyEditor接口
- 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中
我用的是jackson包来讲json数据转化成List<object>
方法在下面
- 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 复杂参数注入的更多相关文章
- spring mvc绑定参数之 类型转换 有三种方式:
spring mvc绑定参数之类型转换有三种方式: 1.实体类中加日期格式化注解(上次做项目使用的这种.简单,但有缺点,是一种局部的处理方式,只能在本实体类中使用.方法三是全局的.) @DateTim ...
- Spring MVC接收参数(Map,List,JSON,Date,2个Bean)(记录一次面试惨状)
题目Spring MVC 接收参数 MapListDate2个BeanJSON Spring MVC接收参数 -Map Spring MVC接收参数 -List Spring MVC接收参数 -dat ...
- Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器
请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...
- Spring MVC请求参数绑定
所谓请求参数绑定,就是在控制器方法中,将请求参数绑定到方法参数上 @RequestParam 绑定单个请求参数到方法参数上 @RequestParam("id") Integer ...
- spring mvc给参数起别名
需求: 将http报文请求(保护body和url)中的参数传递给Controller时支持使用别名. 举例: 下面两条请求报文的结果是一致的. http://example.com/foo?jobTy ...
- Spring MVC处理参数Convert
Springmvc.xml 配置convert,xml中配置多个相同的泛型时,xml里配置的convert会从上到下挨个执行. <!-- 配置注解驱动,并配置convert --> < ...
- Spring MVC Action参数类型 List集合类型(简单案例)
题目:定义一个员工实体(Employee),实现批量添加员工功能,在表单中可以一次添加多个员工,数据可以不持久化 1,新建一个项目 2, 然后选择Maven框架选择 maven-archetype-w ...
- Spring MVC请求参数绑定 自定义类型转化 和获取原声带额servlet request response信息
首先还在我们的框架的基础上建立文件 在domian下建立Account实体类 import org.springframework.stereotype.Controller; import org. ...
- Spring Mvc 传递参数要controller出现了400,日期参数全局处理,格式化yyyy-MM-dd 和yyyy-MM-dd HH:mm:ss
描述:今天做一个业务操作的时候,ajax传递参数要controller出现了400,前后台都没有报错. 问题:springmvc 在接收日期类型参数时,如不做特殊处理 会出现400语法格式错误 解决: ...
随机推荐
- 关于 Swift 4 中内存安全访问
前言 本文主要翻译今年 The Swift Programming Language (Swift 4) 中新出的章节 -<Memory Safety>.在 Swift 4 中,内存安全访 ...
- 阿里巴巴Java开发手册思维导图
趁着有时间把阿里巴巴Java开发手册又看了一遍了,很多时候觉得看完之后,发现自己好像一点都不记得了里面的内容了.只能把大概内容画一遍在脑子里形成一张图方便记忆,这样就更能够记得自己的看完的内容了.其中 ...
- fastDFS文件服务器迁移
在实际的项目应用中,由于服务器替换或项目变更难免会存在fastDFS文件服务器迁移的工作.本文重点介绍fastDFS文件系统在不同情况下的文件迁移处理方案. 1.迁移时IP地址不变 通过文件服务器存储 ...
- 京东口红top 30分析
一.抓取商品id 分析网页源码,发现所有id都是在class="gl-item"的标签里,可以利用bs4的select方法查找标签,获取id: 获取id后,分析商品页面可知道每个商 ...
- [译]ASP.NET Core 2.0 视图引擎
问题 如何在ASP.NET Core 2.0中使用Razor引擎来创建视图? 答案 新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件: public void ConfigureS ...
- Linux系列教程(十二)——Linux软件包管理之yum在线管理
上一篇博客我们介绍了rpm包管理之rpm命令管理,我们发现在使用rpm命令手动安装rpm包的时候,会发现安装遇到到的依赖让你痛不欲生,安装一个rpm时会要先先安装某个依赖的rpm,而安装这个依赖的rp ...
- mongodb集群【】
参考 http://www.jianshu.com/p/2825a66d6aed http://www.cnblogs.com/huangxincheng/archive/2012/03/07/238 ...
- vue实现仿淘宝结账页面
这个demo,是小颖基于之前的 vue2.0在table中实现全选和反选 文章进行更新后的demo,主要功能呢,是仿照淘宝页面的结算购物车商品时自动算出合计价格的页面,具体页面效果请看下面的动图: ...
- Java多线程其他
1.interrupt()方法 interrupt方法不会真正中断线程,它只会清楚线程的wait,sleep,join的受阻状态,时线程重新获得CPU的执行权. 此时如果再次调用线程的wait,sle ...
- C++雾中风景2:struct还是class?
之前因为都在忙着毕业的开题答辩与投稿论文的事宜,一直没有时间更新这个系列的文章.师弟看了上一篇雾中风景的文章,希望我继续把这个系列的文章写下去.坦白说,C++的特性很多,这也不是教学指南的文章,我会选 ...