一、报错复现
前端有一个form表格里面存有数据,需要通过.form("submit")方法传到后端api
<!--表格定义--> <form id="fm_ddlxwh" method="post"> <table> <tr> <td>新增订单类型:</td> <td><input id="ddlx" class="easyui-textbox" type="text" name="ddlxname" data-options="required:true" style="width:200px;"/></td> </tr> </table> </form> <!--传参方法--> <script> function post(){ $("#fm_ddlxwh").form("submit", { url:"/xx" }) } </script>
后端Controller类接收实体类,实体类定义如下:
@Entity @Table(name="t_ddlx") public class Ddlx { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; //编号 @Column(length = 30) private String ddlx;//订单类型 @Column(length = 10) private String createUser;//创建人
Controller类:
@RequestMapping("/list") public void list(Ddlx ddlx){ 省略其余代码...... }
二、报错代码
Resolved [org.springframework.beans.TypeMismatchException:
Failed to convert value of type 'java.lang.String' to required type 'com.faw.pxccl.entityOne.Ddlx';
nested exception is org.springframework.core.convert.ConversionFailedException:
Failed to convert from type [java.lang.String] to type [java.lang.Integer]
for value '中东'; nested exception is java.lang.NumberFormatException:
For input string: "中东"]
分析以上报错,问题出在了前端给后端传参的时候后端接口要求入参类型为Ddlx实体类,但是在数据类型转换的时候不能将前端传入的String类型转换成Interger类型,导致SpringBoot不能自动转换实体类。
思考以上报错,明明我在定义实体类的时候只有ID主键是Interger类型数据,而我传入的ddlx却是String类型,系统错误的将我想要传入的ddlx String类型的数据映射给了id的Interger类型,问题出在哪里呢又如何解决?
三、原因分析和解决
归根结底其实还是由于编码命名不规范导致的。
细心的读者其实发现了上面代码中各类变量及类名的定义其实是汉语拼音缩写,由于这个项目是一个小项目所以在命名的时候没有按照编码规范去命名而是图方便为了省事直接用拼音缩写代替,这就导致实体类名Ddlx与字段ddlx重名,前端在传参给后端的时候生成实体类的时候由于重名导致系统错误的map,所以导致类型转换与实际传参对应不上。
所以编码不管项目大小,一定要养成规范意识,不要随意编码害人害己!
(这个报错解决困扰了我整整一天各方求助最后发现原来是重名问题 =。= 雷人)
除此之外,如果不考虑高并发性能开销的问题,其实在传参的时候可以将参数统一转换成JSON对象,前端使用Ajax 直接POST封装好的JSON对象,就省去了很多烦恼。这样就不用考虑后端存不存在重名问题巴拉巴拉........(纯懒狗作者 =v= )
$.ajax({ url: "/xxxx", // 指向删除操作的URL type: "POST", contentType: "application/json", data: JSON.stringify(id) });