2012-10-17 46 views
5

我目前正在使用Spring 3.1.2 (webflow version 2.3.1),並且我再次面臨一個老問題。問題是通過Spring webflow創建一個新對象。所以我想要做的是以下幾點:在Spring Webflow中創建新對象的首選替代方案

<set name="myBean.foo" value="new Bar()"

我做了一些研究,發現這是一個沒有去。現在面臨同樣的問題,我想知道是否有一些我不知道的問題或者一個首選的替代方案。在過去,我爲此使用了一個靜態工廠。

除了Alan J Liu的回答:每次進行某個轉換(或每次輸入某個視圖)時都需要啓動該對象。

PS:springsource在這裏沒有完全回答我的問題。提前致謝!

+0

所以靜態工廠做你需要什麼,是否正確?你只是尋求替代方法? – dbreaux

+0

其實我只是想知道哪個是最好的方法,因爲創建一個靜態工廠對於我遇到的一些情況確實顯得有點愚蠢。但是你是對的,是的。 – devnomore

+0

瞭解並同意。我只是想澄清。我實際上認爲在視圖狀態內部聲明var會完成它,但是當我剛剛閱讀最新的文檔時,很明顯即使這樣做仍然使用流程範圍的實例。 – dbreaux

回答

5

的 '價值' 屬性接受規劃環境地政司(http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html),這樣你就可以使用new操作符,只要確保您使用的是完全合格的課程名稱即可。最後,新創建的對象是在默認情況下,流動的範圍,但可以明確指定所需的範圍,這是爲我工作:

<view-state id="searchScreen" view="/WEB-INF/jsp/query.view.jsp"> 
    <on-entry> 
     <set name="flashScope.test" value="new java.util.Date()"/> 
    </on-entry> 
    <transition on="..." to="..."> 
     <evaluate expression="..."/> 
    </transition> 
</view-state> 
+0

很好的答案,這真的解決了這個問題!我不知道在這種情況下編寫完全合格的名字的必要性。我非常感謝你! – devnomore

1

您可以使用:

<var name="object1" class="my.package.Object" /> 
<set name="objectHolder.object" value="object1" /> 

行一個將通過構造函數創建一個新的對象,而第二行設置爲(通過制定者)在的ObjectHolder類變量對象。

OR:

<set name="objectHolder.object" value="objectFactory.createObject()" /> 

其中: 公共對象的CreateObject {返回新的對象()}

+0

它會在最初,但也許我應該在我的問題中添加一條關鍵信息:每當進行某個轉換時,都需要啓動「新」對象。因此,這將是第一次,但會重新使用同一個對象... – devnomore

+1

因此,在第2行設置值=「factory.createObject()」,所以每次設置objectHolder.object時都會得到一個新對象。 –

+0

儘管我不喜歡在xml文件中編程,但我確實認爲這將是SpEL的一個缺點,如果這是目前最好/唯一的解決方案。爲不包含任何邏輯的對象創建靜態工廠或爲此提供大量信息是非常奇怪的。我現在正在談論簡單而簡單的模型對象。無論如何,感謝您的意見。看起來我們似乎有相同的方法。 – devnomore

0

我建議爲您的對象一個Java工廠。雖然您可以創建如下對象:

<on-entry> 
     <set name="flashScope.test" value="new java.util.Date()"/> 
</on-entry> 

如果使用對象,則存在重構問題。如果你移動/重命名你的對象,你的XML將被破壞。相反,創建一個工廠,如:

@Component("webflowBeanFactory") 
public class WebflowBeanFactory {  
    public static YourObject yourObjectBean(Object argument) { 
     return new YourObject(argument); 
    } 
} 

,然後從一個Webflow喜歡叫它:

<on-entry> 
     <set name="flashScope.yourObject" value="webflowBeanFactory.yourObjectBean(anyVariable)"/> 
</on-entry> 
相關問題