我有一个Struts 2(JDK 1.7,Struts 2.2.1)应用程序,其中包含一系列过滤条件,这些条件以字符串形式存储在映射中。
Map< String, String > m_filters = new HashMap< String, String >();
public Map< String, String > getFilters() {
return m_filters;
}
我传递的URL格式如下:
即使Map的键和值类型都指定为String,但尝试从中获取值
Map< String, String > filters = getFilters();
String value = filters.get( "fromDate" );
导致抛出此异常:
java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
我在单元测试中重现了这一点,并在调试器中确认Struts 2似乎正在为每个参数创建String [1]而不是String。即,它是一个长度为1的字符串数组,唯一的字符串是期望值(在这种情况下为“ 0”)。
我的问题是:这是Struts2中的错误,还是我做错了什么?
如果是错误,是否有已知的解决方法?
如果遵循Java bean约定,则没有问题。
以下是解决此问题的一些准则:
长话短说遵循惯例。以上行为已通过Struts 2.3.4进行了测试
我正在猜测什么:getter也允许设置(如果只有setter,则只能在映射中设置一项,使用当前参数拦截器就是这种情况)。检查Bean的属性,以查看它应该如何进行类型转换,可能首先会查找setter失败,否则它将查看该名称的属性的操作以确定失败,它将需要使用默认值。默认参数类型是String到String []的映射,这就是您所看到的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句