本帖最后由 qiuyufeifei 于 2009-12-25 10:28:09 编辑

解决方案 »

  1.   

    我配置了,并且
    定义了UserConverter extends StrutsTypeConverter
    自定义转换器而且,我输入name,pass 是可以成功转换为User类的
    另外,conversionError 拦截器 也正常工作了
    当输入非法时conversionError 捕获到了 异常 
    并返回input视图
    我的input页面中 <s:fielderror/> 也成功的输出我自定义的xwork.default.invalid.fieldvalue
    表面上 这一切,Struts2.1都没有出错
    问题是,我的控制台 却报了异常
    而且,注意这不是 一个通常的异常,而是Struts的日志系统 打印出来的
    日志的级别 warn 警告
    并不是 严重我现在的疑问是,既然,前面Struts按照 流程 没有出错
    我不想控制台 打印这些 东西!
      

  2.   

    我换成 Struts2.0的jar包
    struts2-core-2.0.11.1.jar
    xwork-2.0.4.jar其它未做任何改动不报任何错误
    Struts只是在 控制台 打印了两行 转换器的 初始化 信息这个是个BUG吗???? 
      

  3.   

    这个不是 验证啊!
    网络传输的 还是 那些字符串比如 “2009-01-01”原来 我们 服务器端 自己写  
    try{
        new Date(“2009-01-01”)
        return 成功
    }catch{
        return 失败
    }如果使用 Struts框架
    这些代码 就可以有框架提供,而不用自己写啊!就算是验证
    js的客户端验证 肯定会做的
    但服务器端 也肯定不能少啊!你说 是吧??
      

  4.   

    struts的验证不熟悉 应该不是bug吧顶下
      

  5.   

    我不知道你的页面与你的 Action 中的字段是怎么定义的, 但是我根据 Struts2 的警告我猜测, 
    你在页面上应该是 : 
       user:<input name="user" >
       pass:<input name="user" > 
    这样, 对于 Struts2 就会去调用 setUser(String[] string) [Ljava.lang.String 是数组类型]这是 Servlet 容器的解析工作, 其会将页面上所有相同 name 属性的字段封装成一个数组传进 Servlet 中
    (request.getParameters()) ;
    不知道你的 Action 中是如何写的, 如果自定义的类型转换器已经正常写好了 convertFromString 方法的话, 那么在 Action 应该是 
      private User userObj;
      public void setUserObj(User user){...}  这样的形式;"另外,假如我action 中有一个属性是 int 类型 
    当我提交是,不输入 (也就是null) 
    也会报这个错误 "
    对于这个, 是 String <---> Integer 的转换, 这个 Struts2 会自动完成(内建转换器), 如果正常的话
    (是程序正常运行,不是出现异常), 你在这个 <input > 不填写东西话, 其回显会是 '0' , 不会是空字符串;
    "按道理说 
    Struts2 的 conversionError 拦截器 
    已经 处理 异常了,而且页面也成功跳转,错误信息也 正常显示了 
    怎么控制台出现如此之多的异常呢??? "
      自己检查一下你的 conversionError 是不是在 param 这个拦截器的后面? 是的话就如此, 因为对于 Action 中的值的填充是 param 拦截器做的, 而 Struts2 是按照你配置的拦截器的顺序来做这些事情的;
    对于 Struts2 的 js 验证, 这个是需要你配置了 Struts2 提供的 Validation 框架其才会使用, 并且可以在
    <s:form validate=false > 来关闭 JS 验证, 这个并不会关闭服务器端的验证,这些 JS 文件是
    struts2-core-xxx.template.xhtml.validation.js ,对于 Struts2 中的这个路径是可以使用 /struts 来进行
    静态访问的
      

  6.   

    user 里面的2个属性(user,pass)不知道你有没有定义
      

  7.   

    Action 中
    private User user;
    public void setUser(User user){...}
    public User getUser(){...}页面中
    Struts2类型转换
    <s:form action="login" namespace="/md05">
    <s:fielderror/>
    用户信息的用户名和密码以英文的逗号隔开 请输入用户信息:
    <s:textfield name="user" label="请输入用户信息"></s:textfield>
    <s:submit value="登录"></s:submit>
    </s:form>页面中只要输入 name,pass 就可以转换为一个Name=name;Password=pass的User对象 自定义转换器
    public class UserConverter extends StrutsTypeConverter /*extends DefaultTypeConverter*/ { @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
    User user = new User();
    String[] userValues = values[0].split(",");
    user.setName(userValues[0]);
    user.setPass(userValues[1]);
    return user;
    } @Override
    public String convertToString(Map context, Object o) {
    User user = (User) o;
    return "< " + user.getName() + " , " + user.getPass() + " >";
    }
    }配置文件,LoginAction-conversion.properties与Action类在用一个包下
    user=md05.UserConverter
    指定 LoginAction中 的user属性 使用md05.UserConverter自定义转换器 转换Struts2.1的配置文件
    <action name="login" class="md05.LoginAction">
    <result>welcome.jsp</result>
                            <result name="input">error.jsp</result>
    </action>
      

  8.   

    另外
    关于 int和Integer的问题页面<input>中不输入  提交如果Action中 使用int 那么会得到空 页面会成功跳转,
    但是控制台 会打印异常 说找不到 setInt(String)方法
    如果Action中使用 Integer 页面也不会有问题
    控制台 不打印 任何 异常
    包括一楼的问题
    如果我换成 Struts2.0的jar包 
    struts2-core-2.0.11.1.jar 
    xwork-2.0.4.jar 其它未做任何改动 不报任何错误 
    Struts只是在 控制台 打印了两行 转换器的 初始化 信息
      

  9.   

    是的,要避免这个,而达到同样的效果,确实 还有别的方法
    比如,页面中<input name=user.name>
    <input name=user.pass>
    这样就避免使用类型转换。但是,
    第一,我目前正在学习 Struts2.1 (所以最好各个方法的学习一下);
    第二,自定义类型转换,其实很少出现在注册,登陆等方面。
          说实在这个功能,实际使用时,很少用到的。但是,当向集合中 一次提交 多个对象时,
          自定义类型转换就非常有用了,代码也变得整洁和清晰。
     
      

  10.   

    这个问题就会牵扯到 Struts2 是如何反射调用 Action 中的方法的了, 但是这部分他的源代码我也没看懂...
    从 ParametersInterceptor 向里深入, 注释越来越少,很多方法都不知道到底干了什么 - -|| 无语了;如果想继续深入解决这个问题也只有看他的源代码了, 如果你解决了不要忘记告诉我他里面是何时何地如何
    反射调用的 嘿嘿 
      

  11.   


    源码看起来太晕了
    拦截器部分 大多是 代理目前 我只能认为 是BUG
    原来 xwork2.1.2 的jar包就有类似的问题
    当时的是 String 转 int 报错 转 Integer 不报错这一次的是 Struts 不报错,xwork 调 ognl 报错。
    一开始 我以为是 某个 Struts参数设置问题
    因为从 错误信息 上看  是Struts的日志系统打印的
    warn 级别的我想 应该有个参数 来设置 日志的级别
    但是 找了半天 也没有找到!虽然 控制台 有打印 错误,但是 程序和页面都没有中断,也没有什么错误,都是正常流程
    所以 也不影响 使用。
    唯一担心的是,如果每次 自定义类型转换 都有错误信息
    那如果 真的部署到服务器的话,服务器的日志 将有大量的错误信息 被保存到日志中
    这样 既不好看,也影响其他错误的排查!
      

  12.   


    楼主学习了.
    呵呵,如果你觉得是Bug,可以向开发人员提交.
    https://issues.apache.org/struts/browse/WW
    这是Bug跟踪...
      

  13.   

    可能.呵呵
    目前 我只能认为 是BUG 
    原来 xwork2.1.2 的jar包就有类似的问题 
    当时的是 String 转 int 报错 转 Integer 不报错 
      

  14.   

    好像struts确实没能把页面的直接转为int的,甚至,我似乎有一次,页面调用静态方法,方法的参数类型是Object,方法里把Object转为int,却出现错误。
      

  15.   

    随便一个字符串,没有","那么userValues 应该是为空啊,
    userValues[0];
    userValues[1];
    就会有异常吧,这样就不能return user;了,那么action就不能注入user,就是说整个注入过程没有完成任务——setUser()自然就是没有调用,这样系统说找不到,也是对的。个人(菜鸟)理解,还请高手斧正!
      

  16.   


    呵呵, 问题适可而止吧,没必要钻了, 这个问题可以先记下, 说不准以后对 Struts2 更熟悉了, 
    突然在源码中找到答案了 ~ 
      

  17.   


    对 你分析的是正确的。
    但你要考虑 conversionError  拦截器 会捕获异常的
    当配置了 exception 的result 视图后。
    就可以 在发生异常 时 跳转到 exception 的result 中我现在 页面也跳转了,说明conversionError  已经捕获了异常
    但是 控制台却 打印错误信息,这个很烦啊!!以后 一次错误输入,我服务器 日志就一堆的错误。不好看,也不利于 其它错误的排查!!!
      

  18.   

    我在使用struts2.1时也有这个警告但没用过struts2.0
      

  19.   

    遇到了同样的问题,把实体类中的int --> Integer ,警告log就没了。难道真的是xwork-core-2.1.6.jar的问题,寒不知道哪位高人能弄个修复后的xwork-core-2.1.6.jar包出来
      

  20.   

    struts的验证真是烂啊,validation.xml 配置了对四个属性验证,却只对两个起作用,受不了