2013-05-16 140 views
3

我想創建一個操作類,其中沒有setter和getter屬性來處理來自用戶界面的數據。相反,我想在我自己的構建器類中使用ServletActionContext.getRequest().getParameterMap()來構造對象。struts 2 action with no setter getter

我創建了我的Action類,沒有任何屬性。當我提交我的表單時,我正在運行到ognl.OgnlException: target is null for setProperty(null, "field-name", [Ljava.lang.String;@5513fab7)

是否有任何其他約定或配置要求傳達Struts2框架不設置屬性並停止避免上面收到的異常?

回答

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來更改。如果您將配置保存在安全的地方並且不受修改,那麼您可以對運行中的應用程序安全性提出更多要求。

2

是的,您需要刪除此特定操作的映射Struts params interceptor。我相信你可以採取類似於this related question的方法。否則,你將不得不使用你想要的攔截器創建另一個攔截器堆棧,減去參數攔截器,並將動作映射到struts.xml中的堆棧,或者在動作類上使用@InterceptorRef註釋(假設你使用約定插件)。