2013-01-21 70 views
1

我想使我的Spring應用程序中的請求映射成爲動態的。這樣我的網址就無法被理解了。而且我可以向用戶展示任何沒有意義的東西,並且仍然可以解決映射目的。在Spring框架中使用帶有靜態最終變量的@Value註釋

爲此,我將URL的動態部分存儲在屬性文件中。並想在@RequestMapping註釋中使用它。同樣的事情將在JSP的客戶端完成。我將從屬性文件中讀取值,然後創建href。

我使用@Value註釋來讀取屬性文件值。

有一個類在最終的靜態變量中保存所有這些值。

public class UrlMappingAbstraction { 
    public static final @Value("#{urlAbstractionProperties['url.message']?:'message'}") String MESSAGE = ""; 
} 

而我在我的控制器中擴展這個類,並在下面的@RequestMapping註釋中使用靜態final字段。

@RequestMapping(value="/"+MESSAGE+"/{id}", method=RequestMethod.GET) 

而且在JSP中還我讀書用<spring:message/>和生成HREF的URL從屬性文件中的值。

問題是jsp能夠根據屬性文件的值創建正確的url,但在@RequestMapping註解中我的值沒有被替換。

有人可以告訴我確切的問題嗎?我知道我們不能在初始化後改變靜態final變量的值。那麼@Value註釋有什麼用處。

如果這可以做另一種方式,那麼你也可以讓我看看它。

在此先感謝。

回答

2

註解是靜態的,因此你不能這樣做。

@Value不能用於static字段,但這裏沒關係 - 真正的問題是沒有辦法使用編譯時間常量以外的值作爲註釋的屬性。

您可以使用下列選項之一:

  • 添加URL重寫過濾器(如thisthis),並配置它執行必要的轉換。

    由於職責清晰分離 - 控制者負責完成他們的工作,重寫過濾器負責URL的混淆,因此該方法看起來更加優雅。通過這一步驟覆蓋RequestMappingHandlerMapping. getMappingForMethod(),改變他們的URL模式

  • 攔截性創建控制器映射(未測試)

+0

第二個選項看起來更有希望我因爲這將是更具挑戰性。 :-D 我不想去的第一選擇,因爲我已經想通了問這個問題之前。我發現它將需要更多的配置,加上我已經重載的項目中額外依賴的開銷。 感謝您的幫助。一旦我回到我的辦公室,我會檢查一下並回到你身邊。 :) –

0

我會說你應該做反向增加@ axtavt的建議。你真的需要使消息URL運行時可配置嗎?

如果不這樣做的不僅僅是讓就像你擁有它但出@Value一個靜態變量:

public final class UrlMapping { 
    public static final String MESSAGE = "message"; 
} 

然後在你的JSP是指UrlMapping.MESSAGE而不是屬性文件。

雖然它不夠靈活其簡單得多恕我直言它是一個糟糕的主意,使端點的URL過配置,因爲不可避免地,你會硬編碼無論是在Javascript或在模板中的東西。也改變網址對SEO不利。

+0

我的網絡應用程序的目的不適用於搜索引擎優化。其首要任務是安全。這就是爲什麼我想要這樣的事情。 我已經想通了你的選擇,但是按照這種選擇我需要寫小腳本使用JSP中「UrlMapping.MESSAGE」的一部分。在jsp中編寫腳本是非常糟糕的事情。如果它發現IE,它有時會打你。 :d 但是,感謝您的時間和幫助。 :) –

+0

@Japs當然這是「我的意見」,但JSP和Internet Explorer幾乎同樣邪惡:)。我更喜歡Handlebars.java,Freemarker或Scalate。但是,如果JSP的浮動你的船... –

+0

是的,你是對的。 :) –