我有一个 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 约定,则不会有任何问题。
以下是解决该问题的一些准则:
- 如果您将私有成员命名为“filter”并仅为过滤器提供 getter,则不会发生此问题。
- 如果您除了 getter 之外还提供公共 setter(即使您为私有成员使用不同的名称,例如 m_filter),则不会发生此问题
- 仅当您不提供 setter 并且属性与 getter 名称不同时,才会出现此问题。
长话短说遵循惯例。以上行为已使用 Struts 2.3.4 进行测试
我猜正在发生什么:getter 也允许设置(如果只有一个 setter,则只能在映射中设置一项,对于当前参数拦截器来说就是这种情况)。检查 bean 的属性以了解它应该如何进行类型转换,可能首先它会查找 setter,如果失败,它会查看该名称的属性的操作来确定类型,如果失败,则需要使用默认值。默认参数类型是 String 到 String[] 的映射,这就是您所看到的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)