在struts2.0中类型转换出错会自动显示错误信息,也不会报错,但是同样的程序用struts2.1.6 却会报ognl.MethodFailedException:Method "setAge" failed for object com.zte.action.LoginAction@155e3ab [java.lang.NoSuchMethodException: setAge([Ljava.lang.String;)]
等等信息。
百思不得解,望同道中人给于指点迷津!
等等信息。
百思不得解,望同道中人给于指点迷津!
你可以再后台设计的时候把他们设计成String类型的来规避这些错误。
是不是类型转换的问题呢? NOS
可能是2.1.6的类型检测把‘’算成串了。。而不是null。。不过虽然有警告但是不影响正常的使用,,不过在devmode=true时如果影响的话。。
方案1。修改的情况。。把integer的类型在使用前用<s:if>控制一下就行了。没有的情况下可以控制一下不出现name='age'。。
方案二。新建的情况。。javascript控制一下。。业务需求如果年龄可以为空的话可以把这个节点删除。。方法不用说了吧。。parentNode ,removeChildNode那种就行。。
LoginAction.java
public class LoginAction extends ActionSupport{
private String username;
private String pswd;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String execute() throws Exception {
System.out.println("execute");
return "success";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPswd() {
return pswd;
}
public void setPswd(String pswd) {
this.pswd = pswd;
}
}
struts.xml
<struts>
<package name="default" extends="struts-default">
<action name="login" class="com.zte.action.LoginAction">
<result>/result.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>
login.jsp
<s:form action="login">
<s:textfield name="age" label="AGE"></s:textfield>
<s:textfield name="username" label="USERNAME"></s:textfield>
<s:textfield name="pswd" label="PSWD"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
再次说明一下在struts2.0.14中完全正常,在表单age中输入一个字符串,应该正常会提示错误信息,而控制台是不会出错误信息的。
public void setAge(Integer age) {
this.age = age;
}
该为
public void setAge(String age) {
this.age = Integer.parseInt(age);
}
<script>
function check(){
var height = $F('height');
if(height == ""||height == null){
alert("身高不能为空");
return false;
}
return true;
}
</script>
就不会报着个错
至于怎么解决,还没试过,好像是配置捕获异常,然后处理下吧。
commons-io-1.2.jar
commons-logging-1.1.jar
freeer-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xwork-2.0.4.jar楼主可以参考。
commons-io-1.3.2.jar
commons-logging-1.0.4.jar
freeer-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar还是没问题!
不是因为数据类型声明错了..
就是比如年龄属性,那么在bean里面我肯定会设成int型.
那么它对应的set方法当然也会是public void setAge(int age)
但是如果我在页面上输入年龄的时候不是输的数字,那么它就会报跟楼主一样的错.
前提是我屏蔽了javascript脚本....
这个问题怎么解决..希望大家帮忙啊..谢谢.
我没有使用过 Struts2.0(在用2.1.6) 所以我的观点参考参考吧:)
首先说说为什么报 MethodFailedException, 你在页面上对 age 这个 <input> 输入 'ABC' 或者 ' ', 则会报告这个错误是因为 Struts2 的 Type Conversion 没有办法正常的将字符串转换成你 Action 中的 Integer 类型,即类型转换失败,但是值还是会传递到 Action 中,那么此时他调用的方法就是
setAge(String age) 而不是你期望的 setAge(Integer age) 了, 这是方法的重载,肯定你没有参数为 String 的方法,所以其一定会报告 MethodFailedException 错误;
当然这个时候我相信程序一定还是可以运行的,你可以这样做一个试验,无论什么结果,都将页面返回到输入页面,查看其 fielderrors 信息,如果使用的是 <s:textfield/> 那么其会自动将错误显示出来, 也可以使用 <s:debug /> 在页面上查看 ActionContext 中的 errors , 你的转换错误信息肯定会在里面, "Invilid ......"; 为什么会这样呢?这个是 Struts2 的 Type Conversion 的异常处理方式(具体查看文档 Type Conversion 一章);如何解决呢?
其实你这样的输入也就是为什么会有 验证 的存在, 类型转换只是保证了正常的输入 String 能够在服务器端拿到从String 转换过来的 Java 对象, 而 验证 则是保证了页面上 String 的规范; 可以利用 Struts2 的 validator 在
<ActionClassName>-validation.properties 文件中定义你的验证规则, 这个字段需要使用的验证器是 'int'
package com.wqf.validate;import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;public class TypeConvertor extends StrutsTypeConverter { @Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
if (arg2.equals(java.lang.Integer.class)) {
try {
System.out.println("Integer:1111111111111=" + arg1[0]);
Integer i = Integer.parseInt(arg1[0]);
return i;
} catch (Exception e) {
System.out
.println("Integer11111111111111111111111111111111111111111111111111111111111111111"); return null;
}
}
return super.convertValue(arg0, arg1, arg2);
} @Override
public String convertToString(Map arg0, Object arg1) {
Integer i = (Integer) arg1;
return i.toString();
}
}2.添加转换配置文件(我采用方法的是局部注册自定义类型),命名格式:action名-conversion.properties
#book.id位整数,后面为我编写的类型转换类,包括包名,这个文件需要放在同action包下,内容如下:
book.id=com.wqf.validate.TypeConvertor3.如果后面还配置了数据校验,
<field name="age">
<field-validator type="required" short-circuit="true">
<message>年龄不能为空</message>
</field-validator>
<field-validator type="conversion" short-circuit="true">
<message>检查是否将出现数据转换错误</message>
</field-validator>
<field-validator type="int" >
<param name="min">20</param>
<param name="max">30</param>
<message>必须在20至30之间${getText("age.range")}</message>
</field-validator>
</field> 那么输入3.1不合法数据,都会报【序列号不能为空】4.欢迎大家一起来探讨!!,[email protected]