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

标签 java struts2

我有一个 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;无法转换为 java.lang.String

我在单元测试中重现了这一点,并在调试器中确认 Struts 2 似乎正在为每个参数创建一个 String[1] 而不是 String。即它是一个长度为 1 的字符串数组,唯一的字符串是预期值(在本例中为“0”)。

我的问题是:这是 Struts2 中的错误,还是我做错了什么?

如果这是一个错误,是否有已知的解决方法?

最佳答案

如果您遵循 Java bean 约定,就没有问题。

以下是解决问题的一些指南:

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

长话短说遵循惯例。以上行为使用 Struts 2.3.4 测试

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

关于java - 为什么 Struts2 将我的字符串转换为字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13612506/

相关文章:

java - 从整数中提取特定数字

java - 如何获取Struts 2工厂类中的ServletContext

java - OGNL 静态字段在 struts2 中不起作用

java - 谁能告诉我这个伪代码有什么问题?

Java HttpUrlConnection.getInputStream() 延迟

java - 如何设置Http调用器?

java - Spring MVC Struts 混合

jsp - 如何转换 <html :select> dropdown in Struts 2

javascript - 在 <s :if test =""> tag including equalsIgnore case in Struts2 中检查 endswith() 的最佳方法

java - jList 不显示来自自定义模型的数据?