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

2024-04-23

我有一个 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(使用前将#替换为@)

为什么 Struts2 将我的字符串转换为字符串数组? 的相关文章

随机推荐

  • 分配不同价值对象的算法建议

    我有以下问题 给定 N 个对象 N 编辑 通过最公平的分配 我的意思是任何两个玩家获得的物体的价值之间的差异是最小的 另一个类似的情况是 我有N个不同价值的硬币 我需要将它们平均分配给M个玩家 有时他们并没有完全分开 我需要找到下一个最佳的
  • 为什么在 Chrome 中定位:粘性不起作用?

    你怎么获得position sticky在职的 我在 Chrome 26 0 1410 43 m 中尝试了以下操作 但它不起作用 thead position webkit sticky position moz sticky positi
  • $routeProvider 不适用于 html5Mode

    我刚刚开始学习 AngularJs 并尝试使用 Angular 路由服务配置部分页面 它适用于哈希格式 但是 当我试图摆脱哈希时 routeProvider 停止工作 JS app config function routeProvider
  • 使用 JavaScript 创建 csv 文件

    有人可以解释一下是否有一种方法可以将 html5 本地存储数据转换为 csv 文件并将其存储在 ipad 中 我有一个带有一些文本字段的 html 页面 当用户单击提交按钮时 它会存储在 html5 本地存储中 然后我需要使用该数据创建一个
  • 了解 3NF:请用简单的英语

    我正在解决一个示例问题 其中我们试图确定以下哪些关系属于第三范式 3NF 以下是我们给出的关系 R1 ABCD ACD gt B AC gt D D gt C AC gt B R2 ABCD AB gt C ABD gt C ABC gt
  • 如何在不缩小的情况下构建 React 的生产版本?

    背景 我或多或少都在关注使用 React 设置本地开发环境的官方指南 https reactjs org tutorial tutorial html setup option 2 local development environment
  • 将新行添加到控制台输出

    在控制台应用程序中 我们将语句写为 Console WriteLine the addition is 0 i 它给出了输出 加法是50 现在我的问题是 我希望答案如下所示 加法是 50 我如何将输出分配给下一行 Console Write
  • 如何使用 Selenium WebDriver 和 Java 单击按钮?

    以下是按钮的 HTML 代码 span span
  • 什么是沙箱?

    我已阅读维基百科文章 http en wikipedia org wiki Sandbox software development 但我不太确定这意味着什么 以及它与版本控制 如果有人可以用非常简单的术语解释什么是沙箱 那将会很有帮助 A
  • 在 WordPress 中查找当前页码

    我在我的 WordPress 模板中添加了以下自定义循环 args array category not in gt array featured cat gt term id posts per page gt 10 post not i
  • 如何找到UITableViewCell的ViewController?

    我需要参考ViewController from a UITableViewCell以显示UIAlertController来自外部班级 我怎样才能找到该参考文献 你可以获得一个实例UIViewController from UITable
  • 适用于 neovim / vim8 的 C# LSP 自动完成客户端

    我尝试了多种方法来使其发挥作用 但似乎没有简单的方法 是的 有大量的插件和配置 但截至 2019 年 10 月 它们无法正常工作 OmniSharp Vim https github com OmniSharp omnisharp vim客
  • 如果在为 MVC 4 设置依赖项解析器之前使用验证,简单注入器会失败

    我们有一个基于 ASP NET MVC 4 的应用程序 该应用程序已有几年历史 我正在努力消除它的一些技术债务 我正在做的事情之一是引入依赖注入 以便我们可以更好地将业务逻辑与数据访问实现分开 并减少编写隔离单元测试的痛苦 我使用了简单注射
  • 与本机 Windows NPM/Yarn 处理相比,为什么 WSL 极其缓慢?

    我最近经常使用 WSL 因为我需要一些本机 UNIX 工具 并且模拟器还不够好 我注意到使用 NPM Yarn 时的速度差异令人难以置信 我进行了一个简单的测试 证实了我的感受 测试正在运行npx create react app my t
  • 使用 javascript 显示和隐藏引导工具提示

    当用户单击元素且条件为 false 时 我需要显示引导工具提示 我为此编写了代码 div title class stars 425 div 和 JavaScript statistics stars click function if u
  • 如何禁用 KnpMenuBundle 中标签的 HTML 转义

    我想渲染一个HTML标签如 menu gt addChild Dashboard array route gt dashboard label gt i class fa icon bar chart i span class hidden
  • 将正则表达式 python 转换为 javascript

    我对正则表达式很陌生 我在 javascript 中搜索了很长时间 我很高兴有人回复了从 python 转换的 javascript 中正则表达式的详细解释 import re regex r P
  • 无法使用 jquery.cookie 保留复选框值

    I use jQuery DataTable并且有一个checkbox工具栏上用于检索或不检索所有记录 作为状态保存 https datatables net reference option stateSave的特征DataTable无法
  • 在 UINavigationBar TitleView 中垂直居中标签

    我没有太多运气将我添加到 TitleView 的标签垂直居中UINavigationBar 您可以在下面看到它的样子 这就是我添加标签的方式 UILabel titleLabel UILabel alloc init titleLabel
  • 为什么 Struts2 将我的字符串转换为字符串数组?

    我有一个 Struts 2 JDK 1 7 Struts 2 2 1 应用程序 其中包含过滤条件列表 以字符串形式存储在映射中 Map lt String String gt m filters new HashMap lt String