3

我想为来自用户界面的数据创建一个没有 setter 和 getter 的操作类。相反,我想ServletActionContext.getRequest().getParameterMap()在我自己的构建器类中使用来构造对象。

我创建Action了没有属性的类。当我提交表单时,我遇到了ognl.OgnlException: target is null for setProperty(null, "field-name", [Ljava.lang.String;@5513fab7)

是否需要任何其他约定或配置来传达 Struts2 框架以不设置属性并停止避免我在上面收到的异常?

4

2 回答 2

2

是的,您需要为此特定操作删除Struts 参数拦截器映射。我相信您可以采取类似于此相关问题中的方法。否则,您必须使用所需的拦截器创建另一个拦截器堆栈,减去参数拦截器并将操作映射到 struts.xml 中的该堆栈,或者在您的操作类上使用@InterceptorRef注释,假设您使用的是约定插件。

于 2013-05-16T23:23:39.417 回答
2

params您可以通过将参数设置为拦截器来从接受的拦截器参数中排除某些属性excludeParams。默认情况下,此参数初始化为

<interceptor-ref name="params">
  <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>

您应该在此处添加属性,它接受正则表达式模式以匹配属性名称。使用接受的参数名称应用的策略可能会通过ParameterNameAware实施的操作而受到损害,您可以在其中删除上面给出的限制。

为了更具体地说明“来自用户界面的数据”,我坚持认为interceptor-ref元素的参数在启动时应用于拦截器,而不是存储在配置管理器的其他地方。这意味着您无法在运行时获取此参数,只能通过更新和重新加载配置文件来更改struts.xml。如果您将配置保存在安全的地方并防止修改,那么您可以对正在运行的应用程序安全提出更多要求。

于 2013-05-17T08:19:59.687 回答