对于java的报错
警告: Error setting expression 'schance.chc_status' with value '[Ljava.lang.String;@13e6346'
ognl.MethodFailedException: Method "setChc_status" failed for object com.bjsxt.po.Sell_Chance@f8ff42 [java.lang.NoSuchMethodException: com.bjsxt.po.Sell_Chance.setChc_status([Ljava.lang.String;)]
java.lang.NoSuchMethodException: com.bjsxt.po.Sell_Chance.setChc_status([Ljava.lang.String;)
这错误表示给schance.chc_status赋的值为数组,
“[L”表示数组。并且在对象com.bjsxt.po.Sell_Chance上没有相应的setChc_status方法。
在Sell_Chance中,我已给所有属性都添加了相应的get/set方法,struts里也配置了result。但实际上造成这种错误的原因就在于页面的属性类型和王数据库中传递的类型不一致造成的。
后边还可能有这提示
No result defined for action action.UserAction and result input
这是因为没有result name = input的结果映射。
如果页面正常输入,后台处理成功,那么走success页面;如果后台校验失败,会把error存放在指定变量中,这时默认的result的name就为input,此时若没配置,则会报错。
一般是页面的属性和action里的属性个数、名称、类型不一致造成的。
其中,Sell_Chance部分代码为
public class Sell_Chance {
private Status chc_status;//Status为一个实体类,表示派销售机会的状态
public Status getChc_status() {
return chc_status;
}
public void setChc_status(Status chc_status) {//set方法对应的是对象(Status),而不是int等基本类型。
this.chc_status = chc_status;
}
}
Status为
public class Status {
private Integer sid;
private String sname;
//get和set方法省略
}
Sell_ChanceAction为
public String addsc(){
if(schance!=null){
scDao.add(schance);
return "ok";
}else{
return "error";
}
}
jsp部分页面为
<body>
<form action="sellChanceAction!addsc" method="post" >
联系人:<input name="schance.chc_linkName"><br/>
<s:action name="StatusAction!list" namespace="/" var="st"></s:action>
机会状态:
<select name="schance.chc_status">
<s:iterator value="#st.status" var="obj">
<option value=${obj.sid }>${obj.sname }</option>
</s:iterator>
</select>
</form>
</body>
jsp页面可以从数据库中获取到“机会状态”,即s标签起作用。
然后问题就出来了,只要一添加数据就报错,而且调试时也不进入sellChanceAction的addsc方法。用firebug查询post请求,也没发现什么问题,传的值都正常。这就郁闷了,光这问题,查找了一天也没找出原因。在网上看到说是页面跟数据库的数据类型传递错误,可就是找不到。最后经人提醒,终于发现问题所在。在firebug中查看元素,可以看出
<select name="schance.chc_status">
<option value="1">未分配</option>
<option value="2">执行中</option>
<option value="3">开发成功</option>
<option value="4">开发失败</option>
</select>
select name中的值表示一个Status对象(chc_status),而往数据库中存的值却为string型(就是那些option value="1"),所以会发生传值类型错误。
解决方法是将类型统一,改为
<select name="schance.chc_status.sid">
即可成功存入数据。
这也可以看出, 以前不用框架式,这些标签的name可以随便取,使用struts2和hibernate后,标签名就具有意义,因为框架封装的方法要按照这些name去寻找对应的值。
struts2的流程就是找到schance中的chc_status属性,然后找到对应的set方法将其设置。慢慢理解。