2013-03-25 44 views
1

我也許應該指出的是,春天是不是其本身必然至關重要的這個問題,但我同時使用Spring,所以這個問題使用Spring中的情況下碰到過這種情況我在其中遇到了這個問題。春@RequestMapping值使用字符串數組「常量」

我有一個控制器類,它將請求GETPOST請求映射到特定表單的同一組URL。這種形式對於不同的區域設置不同的網址,但是隻有一個用於GET請求的方法,以及一個用於POST,由於在窗體的控制器級的邏輯爲每個區域設置部位相同(但事情在邏輯更深,如特定於語言環境的驗證,可能會有所不同)。例如:

@Controller 
public class MyFormController { 

    // GET request 
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"}, 
      method={RequestMethod.GET}) 
    public String showMyForm() { 
     // Do some stuff like adding values to the model 
     return "my-form-view"; 
    } 

    // POST request 
    @RequestMapping(value={"/us-form.html", "/de-form.html", "/fr-form.html"}, 
      method={RequestMethod.POST}) 
    public String submitMyForm() { 
     // Do stuff like validation and error marking in the model 
     return "my-form-view"; // Same as GET 
    } 
} 

形式GETPOST作品時這樣寫就好了。您會注意到用於@RequestMapping值的String陣列是相同的。我想要做的就是把這些URL到一個點(最好在控制器中的static final場),這樣,當我們添加新的網址(對應於形式在未來本地化的網站),我們就可以在一個地方添加。所以,我想這個修改控制器:

@Controller 
public class MyFormController { 

    // Moved URLs up here, with references in @RequestMappings 
    private static final String[] MY_URLS = 
      {"/us-form.html", "/de-form.html", "/fr-form.html"}; 

    // GET request 
    @RequestMapping(value=MY_URLS, // <-- considered non-constant 
      method={RequestMethod.GET}) 
    public String showMyForm() { 
     // Do some stuff like adding values to the model 
     return "my-form-view"; 
    } 

    // POST request 
    @RequestMapping(value=MY_URLS, // <-- considered non-constant 
      method={RequestMethod.POST}) 
    public String submitMyForm() { 
     // Do stuff like validation and error marking in the model 
     return "my-form-view"; // Same as GET 
    } 
} 

這裏的問題是,編譯器抱怨的value屬性不再是一個常數。我知道Spring要求value必須是一個常量,但我曾經認爲使用final字段(或static final在我的情況下)與Array字面值包含String字面值將會以「常量」的形式傳遞。在這裏,我懷疑是數組文本必須建立在這樣的飛行構造,這是未初始化時value屬性解析。

我覺得這不應該是一個基本的Java知識,找出一個很難的事情,但事情是逃避我,我一直沒能找到任何答案了一些研究之後。有人可以證實我的懷疑,並且爲什麼會這樣做,或者否認我的懷疑並解釋實際問題是什麼?

注意:我不能簡單地將這些網址合併爲一個Path Pattern,因爲每個表單網址都處於其本地化網站的語言中,並且在這種情況下無法進行匹配。舉例來說,我只是將上面的「/{locale}-form.html」字符串作爲我的URL。

+0

可能的重複[註釋屬性RequestMapping.value的值必須是常量表達式](http://stackoverflow.com/questions/14213723/the-value-for-annotation-attribute-requestmapping-value-must- be-a-constant-expre) – sp00m 2013-03-25 17:26:48

+0

@ sp00m它確實可能是重複的。我不確定這是否是一個愚蠢的行爲,因爲那個提問者使用方法的返回值,而不是像我這樣的文字。 – ajp15243 2013-03-25 17:29:55

回答

5

你說得對,這是無關的春天,所有的註釋參數必須是編譯時間常數。這是一個基本的Java語言規則。

標記數組引用作爲最終不削減,因爲這仍然是完全合法的:

MY_URLS[0] = "es-form.html"; 

此外,如何鎖定你進入嵌入區域到像在首位的網址是什麼?你在模仿遺留鏈接嗎? Spring有很多內置的支持使用瀏覽器的實際語言環境。

+0

關於'MY_URLS [0]'的好處,應該考慮到它的含義(我最近在JavaScript領域已經深入)。不幸的是我被鎖定到使用特定於語言環境的URL,因爲我們正在編寫此代碼的客戶端需要它,並且更改它們(如果可能的話,首先)將是一個費力的過程(主要在客戶端部分,但我們可能會從這個過程中得到某種形式的悲傷)。我們在這個約定之後還有幾個表單URL,它們已經或即將上線,並且在最後一分鐘變化也不會有什麼樂趣。 – ajp15243 2013-03-25 17:35:32