2012-10-17 8 views
5

Attualmente sto lavorando con Spring 3.1.2 (webflow version 2.3.1) e sto affrontando un problema più vecchio ancora una volta. Il problema è la creazione di un nuovo oggetto tramite il webflow di Spring. Quindi quello che vorrei fare è la seguente:Alternativa preferita alla creazione di un nuovo oggetto in Spring Webflow

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

ho fatto qualche ricerca e ho scoperto che era un no-go. Ora, di fronte a questo stesso problema, mi chiedo se ci sono forse alcune nuove strutture per questo problema che non conosco o un'alternativa preferita. In passato ho usato una fabbrica statica per questo.

In aggiunta alla risposta di Alan J Liu: l'oggetto deve essere avviato ogni volta che viene effettuata una determinata transizione (o ogni volta che viene inserita una determinata vista).

PS: springsource non ha risposto alla mia domanda qui. Grazie in anticipo!

+0

Così la fabbrica statica fa ciò che è necessario, giusto? Stai solo cercando un'alternativa a questo approccio? – dbreaux

+0

In realtà mi chiedo quale sia l'approccio migliore, perché creare una fabbrica statica sembra un po 'sciocco per alcuni dei casi in cui mi sono imbattuto. Ma tu hai ragione, sì. – devnomore

+0

Capire e concordare. Volevo solo chiarire. In realtà pensavo che dichiarare la var all'interno dello stato di visualizzazione potesse portarlo a termine, ma quando ho letto la documentazione più recente proprio ora, è chiaro che anche il fatto di farlo utilizza ancora un'istanza con scope del flusso. – dbreaux

risposta

5

L'attributo 'valore' accetta SPEL (http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html), in modo da poter utilizzare l'operatore 'nuovo' , assicurati solo di utilizzare il nome completo della classe. Infine, gli oggetti appena creati sono in flusso-scope di default, ma è possibile specificare l'ambito desiderato in modo esplicito, questo sta lavorando per me:

<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

Ottima risposta, questo risolve davvero questo problema! Non sapevo della necessità di scrivere nomi completi in questa situazione. Ti ringrazio molto! – devnomore

1

È possibile utilizzare:

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

linea potrà creare un nuovo oggetto tramite il costruttore, e la seconda linea sarà impostato come un oggetto variabile in classe objectHolder (via setter).

O:

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

Dove: public Object createObject {return new Object()}

+0

Inizialmente, ma forse avrei dovuto aggiungere un'informazione chiave nella mia domanda: il "nuovo" oggetto deve essere avviato ogni volta che viene effettuata una determinata transizione. Quindi questo funzionerebbe la prima volta, ma poi riutilizzerebbe lo stesso oggetto ... – devnomore

+1

Quindi nella riga 2 imposta il valore = "factory.createObject()" in modo da ottenere un nuovo oggetto ogni volta che si imposta objectHolder.object. –

+0

Per quanto non mi piaccia programmare in file xml, penso che sarebbe una lacuna di Spel se questa è attualmente la migliore/unica soluzione.È molto strano creare fabbriche statiche per oggetti che non contengano alcuna logica o che contengano troppe informazioni. Sto parlando di semplici e semplici oggetti del modello in questo momento. Comunque, grazie per il tuo contributo. Sembra che condividiamo lo stesso approccio. – devnomore

0

raccomanda di creare una fabbrica di Java per gli oggetti. Mentre è possibile creare un oggetto come:

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

c'è un problema con il refactoring, se si utilizza l'oggetto. Se sposti/rinomini il tuo oggetto, il tuo XML sarà rotto. Invece di creare una fabbrica come:

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

e quindi chiamare da webflow come:

<on-entry> 
     <set name="flashScope.yourObject" value="webflowBeanFactory.yourObjectBean(anyVariable)"/> 
</on-entry> 
Problemi correlati