最近练习了一个项目,是用的ssh框架做的一个系统,虽说项目是在网上参考的,但还是有好多坑啊,都是因为对相关技术不熟悉的原因造成的,话不多说,直接上问题和解决方案
项目的部分(问题解决前):
- 实体类:除了普通类型的属性,还有对象类型的属性
public class CategorySecond implements Serializable {
private static final long serialVersionUID = 1L;
private Integer csid;
private String csname;
// 所属一级分类.存的是一级分类的对象.
private Category category;
// 配置商品集合
private Set<Product> products = new HashSet<Product>();
// get、set自行补充
- 前端表单重点部分(对象类型是传的category的cid过去)
<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
二级分类名称:
</td>
<td class="ta_01" bgColor="#ffffff" >
<input type="text" name="csname" value="" id="userAction_save_do_logonName" class="bg"/>
</td>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
所属的一级分类:
</td>
<td class="ta_01" bgColor="#ffffff" >
<select name="category.cid">
<s:iterator var="c" value="cList">
<option value="<s:property value="#c.cid"/>"><s:property value="#c.cname"/></option>
</s:iterator>
</select>
</td>
</tr>
- action使用ModelDriven接收数据并封装实体类
public class AdminCategorySecondAction extends ActionSupport implements ModelDriven<CategorySecond> {
// 模型驱动使用的对象
private CategorySecond categorySecond = new CategorySecond();
// 注入二级Service
private CategorySecondService categorySecondService;
// 注入一级分类的Service
private CategoryService categoryService;
@Override
public CategorySecond getModel() {
return categorySecond;
}
// 以下具体业务方法省略
}
其他Java文件不重要,不展示
现在在前端输入表单信息并提交,表面上数据增加成功,但是数据库里category并没有关联上,于是看到控制台报错:
出现的问题:(重点信息)
() 17:58:53,935 ERROR InstantiatingNullHandler:38 - Could not create and/or set value back on to object java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.asm.ClassReader.<init>(Unknown Source) at ......... (
)
() 17:58:53,947 WARN OgnlValueStack:64 - Error setting expression 'category.cid' with value '[Ljava.lang.String;@7837e65a' ognl.OgnlException: target is null for setProperty(null, "cid", [Ljava.lang.String;@7837e65a) .......... (
卡在这一步,于是回头看我参考项目的代码,每一个模块代码都一毛一样!于是开始疯狂的带着报错信息去百度,找到了很多方法,都说什么get、set方法没有加(包括实体类里面的和action类里的),所有方法都试了,解决方法都翻烂了,依旧没有解决这个问题,于是转换了下思考角度,想着从action的ModelDriven入手,直到翻到了这篇文章下面的评论,原来是实体类中对象属性没有实例化,终于!改了之后就行了,人都觉得顺畅了
参考解决方案修改实体类,实例化了对象属性:
public class CategorySecond implements Serializable {
private static final long serialVersionUID = 1L;
private Integer csid;
private String csname;
// 所属一级分类.存的是一级分类的对象.
private Category category = new Category();
// 配置商品集合
private Set<Product> products = new HashSet<Product>();
至此问题终于解决,总结:自己太菜,对好多技术底层及思想不清楚