You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Struts2 Action中以自定义对象为键的Map如何配置请求参数

问题描述

请参考如下AnswerAction定义:

public class AnswerAction extends CommonAction implements SessionAware {
    private CaseNumbering caseNumbering;
    (...)
}

以及FormCaseNumbering定义:

public class FormCaseNumbering implements CaseNumbering {
    private Duplicable innermostElement;
    Map<Duplicable, Integer> caseNumbersOfDuplicableFormElements = new HashMap<>();
    (...)
}

还有DuplicableFormElement定义:

public class DuplicableFormElement implements Duplicable {
    protected int id;
    protected boolean duplicable;
}

该Struts2应用通过Spring注入Bean,配置如下:

<bean id="caseNumbering" scope="prototype"
    class="model.FormCaseNumbering">
    <property name="innermostElement" ref="duplicableFormElement"></property>
</bean>

<bean id="answerAction" class="actions.AnswerAction" scope="prototype" autowire="byName">
    <property name="caseNumbering" ref="caseNumbering"/>
</bean>

需求

如何构造请求参数,为Action的caseNumbering属性中的Map填充一条键为duplicableElement.id=6、值为Integer=1的记录?

已尝试方案

由于caseNumbering通过Spring注入,可正常填充innermostElement属性,如下配置是生效的:

(MockHttpServletRequest)request.setParameter("caseNumbering.innermostElement.id","9");

但使用如下参数配置时抛出错误:

(MockHttpServletRequest)request.setParameter("caseNumbering.caseNumbersOfDuplicableFormElements[6]","1");

错误提示为:

字段"caseNumbering.caseNumbersOfDuplicableFormElements[6]"的值无效。

我还添加了AnswerAction-conversion.properties配置文件,内容如下,仍未生效:

Key_caseNumbering.caseNumbersOfDuplicableFormElements=model.DuplicableFormElement
KeyProperty_caseNumbering.caseNumbersOfDuplicableFormElements=id
Element_caseNumbering.caseNumbersOfDuplicableFormElements=java.lang.Integer
CreateIfNull_caseNumbering.caseNumbersOfDuplicableFormElements=true

请问在Struts2中无需开发自定义转换器的前提下,该需求是否可实现?正确的请求参数应该如何编写?


解答

无需开发自定义转换器即可实现该需求,你现有配置已经基本正确,仅需要调整参数写法、补充两个必要检查项即可。

核心错误原因

Struts2对不同类型的集合参数有不同的语法要求:

  • 数组、List,以及键为基础类型/字符串的Map,使用方括号[]传参
  • 键为自定义对象的Map,必须使用圆括号()包裹KeyProperty对应的匹配值,你之前使用方括号的写法不符合语法要求

正确实现步骤

  1. 修正请求参数写法:将方括号替换为圆括号即可,写法如下:
(MockHttpServletRequest)request.setParameter("caseNumbering.caseNumbersOfDuplicableFormElements(6)","1");
  1. 两个必查项(如果改完参数还报错可以核对):
  • 确保DuplicableFormElement类有public无参构造方法,且id字段提供了public的getter、setter方法,Struts2需要反射创建实例并赋值id属性
  • 确保AnswerAction-conversion.properties文件和AnswerAction类放在同一个包路径下,文件名大小写完全匹配

你之前编写的转换配置内容是完全正确的,不需要修改。


内容的提问来源于stack exchange,提问作者mmalmeida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:54:03