为什么Struts2将我的字符串转换为字符串数组?

肖恩·D:

我有一个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格式如下:

http://myserver.com/myapp/GenerateReport.action?reportID=Whatever&filters.fromDate=0&filters.toDate=2000000000&filters.FcsType=piv_cardholder_3kp&detailed=true

即使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约定,则没有问题。

以下是解决此问题的一些准则:

  • 如果您将私有成员命名为“过滤器”,并且仅提供过滤器的吸气剂,则不会发生此问题。
  • 如果除了getter之外,还提供一个公共的setter(即使您为私有成员使用了不同的名称,例如m_filter),也不会发生此问题。
  • 仅当您不提供设置器且属性与获取器的名称不同时,才会发生此问题。

长话短说遵循惯例。以上行为已通过Struts 2.3.4进行了测试

我正在猜测什么:getter也允许设置(如果只有setter,则只能在映射中设置一项,使用当前参数拦截器就是这种情况)。检查Bean的属性,以查看它应该如何进行类型转换,可能首先会查找setter失败,否则它将查看该名称的属性的操作以确定失败,它将需要使用默认值。默认参数类型是String到String []的映射,这就是您所看到的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么传播语法会将我的字符串转换为数组?

为什么operator <<不会隐式将我的定制类对象转换为字符串

为什么nodejs将我的对象键字符串转换为对象文字?

为什么Powershell将我的哈希表转换为字符串块

为什么将此字符串值转换为数组?

如何将我的变量转换为字符串?

Struts2将空字符串参数转换为“ int”

为什么我的 PHP Curl POST 请求将数据数组转换为字符串?

为什么我的字符串没有在 jQuery 中转换为数组

为什么`join`和/或`JSON :: to_json`默默地将我的数据从整数转换为字符串?

如何将我的字符串转换为数组?(JSON.parse 错误)

如何正确地将我的语法从字符串转换为数组

在java中将我的用户定义字符串转换为char数组

Google Apps脚本将我的数组更改为字符串。为什么?

为什么 FormData.set 将我的数组变成字符串?

从字符数组转换为字符串

将字符串数组转换为字符串

为什么GSON会将对象数组转换为字符串数组呢?

为什么字符串不能转换为日期时间?

为什么将C ++字符串转换为int?

UIColor转换为字符串失败,为什么?

为什么字符串不能转换为对象类

为什么字符串无法从Javascript转换为PHP?

PHP:为什么零长度字符串上的数组语法将字符串转换为数组?

为什么将字符串转换为字符串?

为什么将null字符串强制转换为“ null”字符串

在对字符串进行操作时,为什么将字符串转换为charArray?

如何为我的toString方法将字符串数组转换为字符串

将此字符串转换为字符串数组的最佳方法是什么?