Mi sono trovato nella curiosa situazione di avere un bean gestito da una applicazione JSF e di dover usare tale bean per l'inizializzazione di diversi valori di un altro bean gestito dalla stessa applicazione. Non ho trovato nessun modo esplicito di poter collegare in cascata i bean a run-time, e sono quindi ricorso al costruttore del secondo bean per ottenere il primo e usarlo come parametro di inizializzazione per se stesso.
Si ipotizzi di avere il bean A registrato con id beanA e il bean B registrato con id beanB e di dover eseguire su B il metodo B.initFromA( A a ). E' possibile inserire nel costruttore di B il seguente codice:
public B(){
super();
try{
FacesContext facesContext = FacesContext.getCurrentInstance();
if( facesContext == null )
// non sono in contesto JFS?
return;
Application webApplication = facesContext.getApplication();
ValueBinding valueBinding = webApplication.createValueBinding( "#{beanA}" );
A beanAFromWebApplication = (A) valueBinding.getValue( facesContext );
initFromA( beanAFromWebApplication );
}catch( Exception e ){
// esecuzione non in contesto JFS
// ...
}
}
Da notare che vengono gestite eventuali eccezioni di cast (se il bean non viene trovato oppure non e' del tipo corretto) che consentono l'esecuzione di B anche fuori dal contesto JFS (ossia come bean normale).
Nessun commento:
Posta un commento