最近在使用springMVC的时候,产生了这样一个问题。
一个Hibernate的Entity,命名为Department.
Department 内有一个父节点变量 命名为 depParent;
因为是一个外键设置,所以depParent不能在声明时 却 new ,也不能在get 的时候去new
所以我在一个JSP页面提交一个这样的form时
<form id="addForm" action="addDepartment.htm" method="post" οnsubmit="return inputCheck();">
<table>
<tr>
<td>*<spring:message code="departMent_name" />:</td>
<td><input type="text" id="name" name="name"/></td>
</tr>
<tr>
<td><spring:message code="departMent_beyond" />:</td>
<td>
<!-- <input id="parentDep.id" type="hidden" name="parentDep.id" /><input id="parentDep.name" type="text" name="parentDep.name"/> -->
<input id="parentDep.id" type="text" name="parentDep.id"/>
</td>
</tr>
</table>
<div><input type="submit" value="<spring:message code="submit"/>" /></div>
</form>
这两个input都是有值的,然后我后台的controll用Department进行接收
结果老是抛空指针异常。
用过struts2的都知道,这种写法是没有什么问题,可以直接进行类型的转换。
可是spring不行,我开始还以为是spring mvc不支持这种对象的嵌套的类型转换。
但是写propertyEditor也解决不了问题,
最后没办法只能跟踪源码,发现spring在做类型转换时,会用反射的方法取调用get方法,结果取出来是null,就会抛异常。
所以,最后的解决方案,只能再做一个暂态的变量来给spring进行转换。
到此,问题找了个折中的方式解决了。
不过从这点来看,spring的类型转换没有strust2的强大和智能,
所以如果想采用这种方式,对象类的嵌套对象,在get方法的时候必须能取到一个对象,而不是null。如果没办法new,就用一个新的变量来做一个中转吧。
这是我自己学习找到的一些经验,如有什么不足,多指教。