sabato 29 gennaio 2011

JSF: propagare le proprieta' di un bean ad un altro bean

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: