2012-06-14 157 views
1

我正在使用Struts並遇到一些奇怪的行爲。雖然它不會產生任何錯誤或錯誤,但我認爲與您分享它會很有趣。Struts2中的奇怪行爲

也許你們其中一個可以解釋爲什麼會發生這種情況。

創建下面的代碼一個Struts動作 -

public class MyAction extends ActionSupport { 
    private Map<String, Map<String, Object>> map = new HashMap<String, Map<String, Object>>(); 
    public String execute() { 
     System.out.println(map); 
     return SUCCESS; 
    } 

    public Map<String, Map<String, Object>> getMap() { 
     return map; 
    } 

    public void setMap(Map<String, Map<String, Object>> map) { 
     this.map = map; 
    } 
} 

創建關聯的映射和需要JSP和執行的操作。 你會看到下面的控制檯輸出 -

{systemProperties={java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=C:\Program Files\Java\jdk1.6.0_32\jre\bin, java.vm.version=20.7-b02, shared.loader=${catalina.base}/shared/classes .... 

因此很明顯,Struts是注射系統性能到我的地圖。 但它爲什麼這樣做呢?我沒有要求它這樣做。沒有使用特殊的XML配置或註釋。 什麼部分的Struts(什麼攔截器)負責這個?我剛剛發現了一個錯誤還是這種正常行爲?如果這是正常的,爲什麼Struts開發人員認爲將每個Map<String, Map<String, Object>>注入系統屬性都是明智的做法?

+0

在你的spring配置XML中設置了'autowire'參數嗎? – plucury

+0

@plucury爲什麼會有所作爲? Spring注入bean依賴關係。它不注入集合。 –

+0

如果設置了方法,Spring會注入任何類型的屬性。 – plucury

回答

0

我剛試過這個,我的猜測是正確的。 您在此輸出的代碼不會產生任何此類結果。您可以通過查看代碼輕鬆發現此問題。沒有什麼是填充地圖,它只是獲取者和制定者。

"So apparently Struts is injecting the system properties into my map"

如果參數傳遞給這個動作,例如用一種形式,Struts將會尋找在行動了相應的setter法。這會表明在你的代碼的某個地方,你的表單或者參數,你有一些叫做"map"的東西傳給了這個Action。

首先看看你的struts.xml,看看你是否設置了一些參數。如果沒有,那麼仔細看看你在哪裏調用動作,以及你發送了什麼參數。那麼你應該能夠找到你在地圖上傳遞的位置。

+0

你能分享你的測試應用程序的zip嗎?我試過了,它確實爲我產生了這樣的結果。 –

+0

你嘗試過「乾淨」嗎?從代碼中創建一個名爲MyAction2的新ActionClass。然後創建一個struts.xml映射到'。然後去localhost/testAction來測試它。你可能會得到某種404,但看看你的輸出。地圖應該是空的。如果它不是空的,那麼它意味着你的應用程序中的某些東西正在設置屬性「地圖」。這可能意味着你的操作是擴展的東西,或者你可能有一些攔截器在做時髦的事情 – user829237