我想为来自用户界面的数据创建一个没有setter和getter属性的动作类。相反,我想在我自己的构建器类中使用ServletActionContext.getRequest().getParameterMap()
来构造对象。
我创建了没有属性的Action
类。当我提交表单时,我遇到了ognl.OgnlException: target is null for setProperty(null, "field-name", [Ljava.lang.String;@5513fab7)
是否需要任何其他约定或配置来传达Struts2框架以不设置属性并停止避免我上面收到的异常?
答案 0 :(得分:2)
是的,您需要删除此特定操作的Struts params interceptor映射。我相信你可以采取与this related question类似的方法。否则你将不得不用你想要的拦截器创建另一个拦截器堆栈,减去参数拦截器并将动作映射到struts.xml中的那个堆栈,或者在你的动作类上使用@InterceptorRef注释,假设你正在使用惯例插件。
答案 1 :(得分:2)
您可以通过将参数excludeParams
设置为拦截器,从params
拦截器的可接受参数中排除某些属性。默认情况下,此参数使用
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
您应该在这里添加属性,它接受正则表达式模式以匹配属性名称。使用已接受的参数名称应用的策略可能会通过ParameterNameAware
实施的操作受到影响,您可以删除上面给出的限制。
更具体地说“来自用户界面的数据”我坚持认为interceptor-ref
元素的参数在启动时应用于拦截器,并且不存储在配置管理器的其他位置。这意味着您无法在运行时获取此参数,只能通过更新和重新加载配置文件struts.xml
来更改。如果您将配置保存在安全的地方并且不受修改,那么您可以对正在运行的应用程序安全性提出更多声明。