警告: Error setting expression 'schance.chc_status' with value '[Ljava.lang.String;@13e6346'

8 篇文章 0 订阅
7 篇文章 0 订阅

对于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方法将其设置。慢慢理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值