Domanda

Ho appena iniziato a leggere attraverso Nucleo JavaServer Faces, 3rd Ed. e dicono questo (sottolineatura mia ):

  

Si tratta di un incidente storico che ci sono due meccanismi separati, fagioli CDI   e JSF gestito fagioli, per i fagioli che possono essere utilizzati nelle pagine JSF. Consigliamo   utilizzare i fagioli CDI a meno che l'applicazione di lavoro deve su un servlet pianura   corridore come ad esempio Tomcat.

Perché? Non forniscono qualsiasi giustificazione. Sto usando @ManagedBean per tutti i fagioli in un prototipo di applicazione in esecuzione su GlassFish 3, e non ho mai notato alcun problema con questo. Non mi importa soprattutto la migrazione da @ManagedBean a @Named, ma io voglio sapere perché dovrei preoccuparsi .

È stato utile?

Soluzione

CDI è preferito perché semplice JSF CDI consente l'iniezione di dipendenza JavaEE livello. È inoltre possibile iniettare POJO e lasciarli essere gestiti. Con JSF si può solo iniettare un sottoinsieme di quello che si può con CDI.

Altri suggerimenti

Usa CDI.

Come per JSF 2.3, @ManagedBean è deprecato . Vedi anche spec problema 1417 . Questo significa che non c'è più un motivo per scegliere @ManagedBean sopra @Named. Questa è stata implementata la prima volta nel Mojarra 2.3.0 versione beta M06.

 entrare descrizione dell'immagine qui


Storia

La differenza principale è, @ManagedBean è gestito da quadro JSF ed è solo attraverso @ManagedProperty disposizione di un secondo JSF gestito fagioli. @Named è gestito da server di applicazione (il contenitore) tramite CDI quadro ed è tramite @Inject a disposizione di qualsiasi tipo di un contenitore gestito artefatto come @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, ecc e anche un @ManagedBean JSF. Dall'altro lato su, @ManagedProperty fa il lavoro non all'interno di un @Named o qualsiasi altro contenitore artefatto gestito. Funziona davvero solo all'interno @ManagedBean.

Un'altra differenza è che inietta CDI effettivamente proxy delega all'istanza corrente nell'area di destinazione su una base per-request / filo (come esempio come sono state iniettate bean). Questo meccanismo consente l'iniezione di un chicco di un ambito più ristretto in un bean di portata più ampia, che non è possibile con JSF @ManagedProperty. JSF "inietta" qui l'istanza fisica direttamente invocando un setter (che è anche esattamente il motivo è necessario un setter, mentre questo è non richiesto con @Inject).

Anche se non direttamente uno svantaggio - ci sono altri modi - il campo di applicazione @ManagedBean è semplicemente limitato. Dall'altro punto di vista, se non si vuole esporre "troppo" per @Inject, si può anche solo mantenere il vostro fagioli @ManagedBean gestito. E 'come protected contro public. Ma che in realtà non conta.

Almeno, in JSF 2.0 / 2.1, il principale svantaggio di gestione fagioli JSF backing da CDI è che non c'è CDI equivalente di @ViewScoped. Il @ConversationScoped si avvicina, ma richiede ancora avviando manualmente e l'arresto ed aggiunge un parametro di richiesta cid brutto URL esito. MyFaces CODI rende più facile da completamente trasparente colmare javax.faces.bean.ViewScoped di JSF per CDI in modo da poter fare solo @Named @ViewScoped, tuttavia, che aggiunge un parametro di richiesta windowId brutto per gli URL di risultato, anche sulla plain vanilla da pagina a pagina di navigazione. OmniFaces risolve tutto questo con un vero CDI @ViewScoped che lega davvero portata del bean per JSF stato di visualizzazione invece che a un parametro di richiesta arbitrario.

JSF 2.2 (che viene rilasciata 3 anni dopo questa domanda / risposta) offre una nuova completamente CDI @ViewScoped compatibile annotazione fuori la scatola di sapore di javax.faces.view.ViewScoped. JSF 2.2 viene fornito anche con un @FlowScoped CDI-only, che non ha un equivalente @ManagedBean, dichiaro di spingere gli utenti verso JSF CDI. L'aspettativa è che @ManagedBean e gli amici sarà deprecato come per Java EE 8. Se si sta attualmente ancora utilizzando @ManagedBean, è pertanto consiglia vivamente di passare a CDI a Be preparato per futuri percorsi di aggiornamento. CDI è prontamente disponibile in contenitori compatibili Java EE Web Profilo, come wildfly, TomEE e GlassFish. Per Tomcat, è necessario installare separatamente, esattamente come già fatto per JSF. Vedi anche Come installare CDI in Tomcat?

Con Java EE 6 e CDI si dispone di un'opzione diversa per Beans Managed

  • @javax.faces.bean.ManagedBean è fare riferimento alla JSR 314 ed è stata introdotta con JSF 2.0. L'obiettivo principale era quello di evitare la configurazione nel file faces-config.xml per usare il fagiolo all'interno di una pagina JSF.
  • @javax.annotation.ManagedBean(“myBean”) è definito dalla JSR 316. Si generalizza il JSF è riuscito fagioli per uso altrove in Java EE
  • @javax.inject.Named(“myBean”) sono quasi la stessa, come quella precedente, tranne è necessario un file beans.xml nel web / WEB INF-Folder per attivare CDI.

Stavo usando CDI in GlassFish 3.0.1, ma per farlo funzionare ho dovuto importare il quadro Seam 3 (Weld). Che ha funzionato abbastanza bene.

In GlassFish 3.1 CDI ha smesso di funzionare, e il cordone di saldatura ha smesso di funzionare con esso. Ho aperto un bug su questo ma non l'ho visto ancora fissato. Ho dovuto convertire tutto il mio codice per utilizzare i javax.faces. * Annotazioni, ma ho intenzione di tornare a CDI una volta che ottengono che funziona.

Sono d'accordo che si dovrebbe usare CDI, ma una questione che non ho visto ancora risolto è cosa fare con l'annotazione @ViewScoped. Ho un sacco di codice che dipende da esso. Non è chiaro se @ViewScoped funziona se non si utilizza @ManagedBean con esso. Se qualcuno può chiarire questo sarei grato.

Una buona ragione per passare al CDI: si potrebbe avere una risorsa di sessione con ambito comune (profilo utente per esempio) @Inject'ed in entrambi i fagioli JSF gestito e servizi REST (vale a dire, Jersey / JAX-RS)

D'altra parte, @ViewScoped è un motivo valido per attaccare con JSF @ManagedBean - soprattutto per nulla con AJAX significativo. Non v'è alcuna sostituzione standard per questo in CDI.

Sembra che essa può avere un certo sostegno per un @ViewScoped-come annotazioni per i fagioli CDI, ma non ho giocato con lui personalmente.

http://seamframework.org/Seam3/FacesModule

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top