在struts2.0中类型转换出错会自动显示错误信息,也不会报错,但是同样的程序用struts2.1.6 却会报ognl.MethodFailedException:Method "setAge" failed for object com.zte.action.LoginAction@155e3ab [java.lang.NoSuchMethodException: setAge([Ljava.lang.String;)]
等等信息。
百思不得解,望同道中人给于指点迷津!

解决方案 »

  1.   

    呵呵,应该是空的时候才会报错吧。“”当然没发转换成int了.不过不影响使用.
      

  2.   

    比如有个表单是年龄,在ACTION中定义属性 int age  public int getAge( int age ){this.age = age},如果页面输入“abc”或空 都会报错 错误类型 ognl.MethodFailedException,但是在 struts2.0中是正常的。网上查了关于这个问题,都没有正面的回答。希望在CSDN中能找到答案。
      

  3.   

    页面上的都是字符串的,
    你可以再后台设计的时候把他们设计成String类型的来规避这些错误。
    是不是类型转换的问题呢? NOS
      

  4.   

    [java.lang.NoSuchMethodException: setAge([Ljava.lang.String;)]你的Action有setAge方法吗?
      

  5.   

    希望对STRUTS2了解的朋友,给与帮助。
      

  6.   

    LZ你这个我原来的公司也遇到过。。这是升级导致的版本问题。。
    可能是2.1.6的类型检测把‘’算成串了。。而不是null。。不过虽然有警告但是不影响正常的使用,,不过在devmode=true时如果影响的话。。
    方案1。修改的情况。。把integer的类型在使用前用<s:if>控制一下就行了。没有的情况下可以控制一下不出现name='age'。。
    方案二。新建的情况。。javascript控制一下。。业务需求如果年龄可以为空的话可以把这个节点删除。。方法不用说了吧。。parentNode ,removeChildNode那种就行。。
      

  7.   

    要把 setAge搞上,, 我弄struts 2.1.6 没见这个错误的。 
      

  8.   

    7楼的同志说的很好,不过我挺纳闷的,就是同样的程序在struts2.0.14中却一切正常,究竟2个版本有什么样的区别呢?
      

  9.   

    我把部分代码贴出来,但我相信熟悉STRUTS2的朋友,不用我贴代码也能明白我的意思。
    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中输入一个字符串,应该正常会提示错误信息,而控制台是不会出错误信息的。
      

  10.   

    setAge([Ljava.lang.String;)] 这个可以看出 你传的参数是String类型, 而你的函数传的参数是int类型, 系统就抛出找不到该方法的异常
      

  11.   

    将方法
    public void setAge(Integer age) { 
       this.age = age; 
    }
    该为
    public void setAge(String age) { 
       this.age = Integer.parseInt(age); 
    }
      

  12.   

    不好意思,如果您精通STRUTS1.X而并不了解STRUTS2,请不要随便发言。诚信求教,但不希望随便乱教。
      

  13.   

    我解决了,再页面加上
    <script>
    function check(){

    var height =  $F('height');

    if(height == ""||height == null){
    alert("身高不能为空");
    return false;
    }
    return true;
    }
    </script>
    就不会报着个错
      

  14.   

    STRUTS2自动类型转换,如果转换不了,会自动在页面显示错误信息,这个在2.0.14中,完全没有问题。我是抛开所有其他技术,纯STRUTS2.X的做法。谢谢,继续关注
      

  15.   

    是大小写问题,javaBean中的字段必须小写,然后生成get set 方法
      

  16.   

    private Integer age   不能是 private Integer Age
      

  17.   

    我前几天碰到过这个问题,age是Integer型的,如果页面输入形如“abc”的纯字符串时,后台会你这个错误。这是因为默认情况下,struts2在进行自动类型转换时,如果转换不成功不在后台报错。
    至于怎么解决,还没试过,好像是配置捕获异常,然后处理下吧。
      

  18.   

    我把楼主的代码整个试了一下,没有任何问题。感觉可能是使用jar包本不匹配的问题。我使用的jar是:commons-fileupload-1.1.1.jar
    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楼主可以参考。
      

  19.   

    OK, 再来一遍,这回用的是:commons-fileupload-1.2.1.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还是没问题!
      

  20.   

    2.16建议还是别先使用了,会出莫名其妙的问题,前几天想整个2.16看看的结果整一上午都没搞定个错误。还是struts1.X 好 稳定
      

  21.   

    楼方我跟你遇到了一样的问题..
     不是因为数据类型声明错了..
       就是比如年龄属性,那么在bean里面我肯定会设成int型.
      那么它对应的set方法当然也会是public void setAge(int age)
     但是如果我在页面上输入年龄的时候不是输的数字,那么它就会报跟楼主一样的错.
     前提是我屏蔽了javascript脚本....
     这个问题怎么解决..希望大家帮忙啊..谢谢.
      

  22.   

    顶 顶!!!我也一样遇到了相同的问题:Method "setAge" failed for object com.ni.struts2.action.RegisterAction@1bef5e8 java.lang.NoSuchMethodException: setAge([Ljava.lang.String;)希望大家快点来解决!!
      

  23.   


    我没有使用过 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'
      

  24.   

    这个问题,我能解决,就是在set之前,进行类型转换,在转换类中如果转换失败,把该值设置成null(我目前只能设置null,应该也可以把转换过程中的异常抛出,然后再去捕捉这个异常),方法:如下:1.编写数据转换类,TypeConvertor.java
    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]