Strut2.1类型转换的问题,不知道算不算BUG

qiuyufeifei 2009-12-25 10:22:15
Struts2.1

Struts2-code-2.1.8.1.jar
xwork-core-2.1.6.jar

其它的jar我都添加,不过貌似和这个异常没什么关系,所以我就不贴出来了

我使用Struts2.1 的类型转换
action中 有一个User
已经配置了转换器UserConverter
配置了
Result name=“input” 页面

页面输入时
name,pass
这样的格式
就可以 转换为 User 类型

如果随便输入 一个字符串
为跳至 input页面 使用<s:fielderror/> 标签 输出错误信息

现在问题是 输入错误
页面可以成功 跳至 input页面 并显示错误信息
但,为什么控制台 却显示一堆的 错误
2009-12-24 20:31:20 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Error setting expression 'user' with value '[Ljava.lang.String;@75d174'
ognl.MethodFailedException: Method "setUser" failed for object md05.LoginAction@1ee9cc3 [java.lang.NoSuchMethodException: md05.LoginAction.setUser([Ljava.lang.String;)]
………………


从异常上来 看说是没有找到 setUser(String) 方法,
可是,Struts不是会进行类型转换吗

按道理说
Struts2 的 conversionError 拦截器
已经 处理 异常了,而且页面也成功跳转,错误信息也 正常显示了
怎么控制台出现如此之多的异常呢???


另外,假如我action 中有一个属性是 int 类型
当我提交是,不输入 (也就是null)
也会报这个错误

而当我把类型改为 Integer 时
则不会报错


...全文
476 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluhar 2010-09-18
  • 打赏
  • 举报
回复
struts的验证真是烂啊,validation.xml 配置了对四个属性验证,却只对两个起作用,受不了
bluhar 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qiuyufeifei 的回复:]

另外
关于 int和Integer的问题

页面<input>中不输入 提交

如果Action中 使用int 那么会得到空 页面会成功跳转,
但是控制台 会打印异常 说找不到 setInt(String)方法

如果Action中使用 Integer 页面也不会有问题
控制台 不打印 任何 异常

包括一楼的问题
如果

我换成 Struts2.0的jar包
s……
[/Quote]

学习了,正为此事郁闷.
baojyy1 2010-06-09
  • 打赏
  • 举报
回复
遇到了同样的问题,把实体类中的int --> Integer ,警告log就没了。

难道真的是xwork-core-2.1.6.jar的问题,寒

不知道哪位高人能弄个修复后的xwork-core-2.1.6.jar包出来
cangruxue 2010-03-21
  • 打赏
  • 举报
回复
我在使用struts2.1时也有这个警告但没用过struts2.0
qiuyufeifei 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 t_or_m 的回复:]
引用 12 楼 qiuyufeifei 的回复:
引用 9 楼 purking 的回复:
自定义转换器
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;
}

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

个人(菜鸟)理解,还请高手斧正!
[/Quote]

对 你分析的是正确的。
但你要考虑 conversionError 拦截器 会捕获异常的
当配置了 exception 的result 视图后。
就可以 在发生异常 时 跳转到 exception 的result 中

我现在 页面也跳转了,说明conversionError 已经捕获了异常
但是 控制台却 打印错误信息,这个很烦啊!!

以后 一次错误输入,我服务器 日志就一堆的错误。不好看,也不利于 其它错误的排查!!!
zxj828282 2010-01-03
  • 打赏
  • 举报
回复
123
liuxin0369 2010-01-03
  • 打赏
  • 举报
回复
路过,正好不会,学习一下
Purking 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 qiuyufeifei 的回复:]
引用 15 楼 purking 的回复:
这个问题就会牵扯到 Struts2 是如何反射调用 Action 中的方法的了, 但是这部分他的源代码我也没看懂...
从 ParametersInterceptor 向里深入, 注释越来越少,很多方法都不知道到底干了什么 - -|| 无语了;

如果想继续深入解决这个问题也只有看他的源代码了, 如果你解决了不要忘记告诉我他里面是何时何地如何
反射调用的 嘿嘿


源码看起来太晕了
拦截器部分 大多是 代理

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

这一次的是 Struts 不报错,xwork 调 ognl 报错。


一开始 我以为是 某个 Struts参数设置问题
因为从 错误信息 上看  是Struts的日志系统打印的
warn 级别的

我想 应该有个参数 来设置 日志的级别
但是 找了半天 也没有找到!

虽然 控制台 有打印 错误,但是 程序和页面都没有中断,也没有什么错误,都是正常流程
所以 也不影响 使用。
唯一担心的是,如果每次 自定义类型转换 都有错误信息
那如果 真的部署到服务器的话,服务器的日志 将有大量的错误信息 被保存到日志中
这样 既不好看,也影响其他错误的排查!
[/Quote]

呵呵, 问题适可而止吧,没必要钻了, 这个问题可以先记下, 说不准以后对 Struts2 更熟悉了,
突然在源码中找到答案了 ~
三味书屋 2009-12-30
  • 打赏
  • 举报
回复
顶一下
ssssss 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qiuyufeifei 的回复:]
引用 9 楼 purking 的回复:
自定义转换器
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;
}
[/Quote]
随便一个字符串,没有","那么userValues 应该是为空啊,
userValues[0];
userValues[1];
就会有异常吧,这样就不能return user;了,那么action就不能注入user,就是说整个注入过程没有完成任务——setUser()自然就是没有调用,这样系统说找不到,也是对的。

个人(菜鸟)理解,还请高手斧正!
ssssss 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1楼 :]
而当我把类型改为 Integer 时
则不会报错
[/Quote]
好像struts确实没能把页面的直接转为int的,甚至,我似乎有一次,页面调用静态方法,方法的参数类型是Object,方法里把Object转为int,却出现错误。
qiuyufeifei 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wenjjing2lianee 的回复:]
引用 16 楼 qiuyufeifei 的回复:
引用 15 楼 purking 的回复:
这个问题就会牵扯到 Struts2 是如何反射调用 Action 中的方法的了, 但是这部分他的源代码我也没看懂...
从 ParametersInterceptor 向里深入, 注释越来越少,很多方法都不知道到底干了什么 - -|| 无语了;

如果想继续深入解决这个问题也只有看他的源代码了, 如果你解决了不要忘记告诉我他里面是何时何地如何
反射调用的 嘿嘿


源码看起来太晕了
拦截器部分 大多是 代理

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

这一次的是 Struts 不报错,xwork 调 ognl 报错。


一开始 我以为是 某个 Struts参数设置问题
因为从 错误信息 上看  是Struts的日志系统打印的
warn 级别的

我想 应该有个参数 来设置 日志的级别
但是 找了半天 也没有找到!

虽然 控制台 有打印 错误,但是 程序和页面都没有中断,也没有什么错误,都是正常流程
所以 也不影响 使用。
唯一担心的是,如果每次 自定义类型转换 都有错误信息
那如果 真的部署到服务器的话,服务器的日志 将有大量的错误信息 被保存到日志中
这样 既不好看,也影响其他错误的排查!


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

我去看看
qiuyufeifei 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mrs_xin 的回复:]
像这样的类 不同自己转换不也可以吗
[/Quote]
是的,要避免这个,而达到同样的效果,确实 还有别的方法
比如,页面中<input name=user.name>
<input name=user.pass>
这样就避免使用类型转换。

但是,
第一,我目前正在学习 Struts2.1 (所以最好各个方法的学习一下);
第二,自定义类型转换,其实很少出现在注册,登陆等方面。
说实在这个功能,实际使用时,很少用到的。但是,当向集合中 一次提交 多个对象时,
自定义类型转换就非常有用了,代码也变得整洁和清晰。
qiuyufeifei 2009-12-28
  • 打赏
  • 举报
回复
另外
关于 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只是在 控制台 打印了两行 转换器的 初始化 信息


qiuyufeifei 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 purking 的回复:]
我不知道你的页面与你的 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 来进行
静态访问的
[/Quote]
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>

wenjjing2lianee 2009-12-28
  • 打赏
  • 举报
回复
可能.呵呵
目前 我只能认为 是BUG
原来 xwork2.1.2 的jar包就有类似的问题
当时的是 String 转 int 报错 转 Integer 不报错
wenjjing2lianee 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 qiuyufeifei 的回复:]
引用 15 楼 purking 的回复:
这个问题就会牵扯到 Struts2 是如何反射调用 Action 中的方法的了, 但是这部分他的源代码我也没看懂...
从 ParametersInterceptor 向里深入, 注释越来越少,很多方法都不知道到底干了什么 - -|| 无语了;

如果想继续深入解决这个问题也只有看他的源代码了, 如果你解决了不要忘记告诉我他里面是何时何地如何
反射调用的 嘿嘿


源码看起来太晕了
拦截器部分 大多是 代理

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

这一次的是 Struts 不报错,xwork 调 ognl 报错。


一开始 我以为是 某个 Struts参数设置问题
因为从 错误信息 上看  是Struts的日志系统打印的
warn 级别的

我想 应该有个参数 来设置 日志的级别
但是 找了半天 也没有找到!

虽然 控制台 有打印 错误,但是 程序和页面都没有中断,也没有什么错误,都是正常流程
所以 也不影响 使用。
唯一担心的是,如果每次 自定义类型转换 都有错误信息
那如果 真的部署到服务器的话,服务器的日志 将有大量的错误信息 被保存到日志中
这样 既不好看,也影响其他错误的排查!
[/Quote]

楼主学习了.
呵呵,如果你觉得是Bug,可以向开发人员提交.
https://issues.apache.org/struts/browse/WW
这是Bug跟踪...
xiabobin 2009-12-28
  • 打赏
  • 举报
回复
这个问题我也不会,帮你顶贴,我也学学
qiuyufeifei 2009-12-28
  • 打赏
  • 举报
回复
沉的好快啊
无奈的顶
qiuyufeifei 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 fyjava1984 的回复:]
现在不用了
[/Quote]
你是指什么啊??????
加载更多回复(14)

67,519

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧