我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
我传递了一个格式如下的URL:
即使Map具有指定为String的键和值类型,也尝试从中获取值
Map< String, String > filters = getFilters();
String value = filters.get( "fromDate" );
Run Code Online (Sandbox Code Playgroud)
导致抛出此异常:
java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String
我在单元测试中重现了这一点,并在调试器中确认Struts 2似乎为每个参数创建了一个String [1]而不是String.即它是一个长度为1的字符串数组,唯一的字符串是期望值(在这种情况下为"0").
我的问题是:这是Struts2中的一个错误,还是我做错了什么?
如果是一个bug,是否有一个已知的解决方法?
如果遵循Java bean约定,则没有问题.
以下是解决此问题的一些指导原则:
长篇简短的遵循惯例.以上行为使用Struts 2.3.4进行了测试
我猜测正在发生的事情:getter允许设置(如果只有一个setter你只能在地图中设置一个项目,那么当前的参数拦截器就是这种情况).检查bean的属性以查看它应该如何进行类型转换可能首先它查找一个setter失败,它查看该名称的属性的动作以确定它将需要使用默认值的类型失败.默认参数类型是String到String []的映射,这就是您所看到的.
归档时间: |
|
查看次数: |
2103 次 |
最近记录: |