Frage

Ich habe gerade angefangen Lesen durch Core-Javaserver Faces, 3. Aufl. und sie sagen, dass dies (Hervorhebung von mir ):

  

Es ist ein historischer Zufall, dass es zwei separate Mechanismen, CDI Bohnen   und JSF verwaltet Bohnen, für Bohnen, die in JSF-Seiten verwendet werden kann. Wir empfehlen   dass Sie verwenden CDI Bohnen , es sei denn Ihre Anwendung muss Arbeit auf einem einfachen Servlet   Läufer wie Tomcat.

Warum? Sie bieten keine alle Begründung. Ich habe für alle Bohnen in einer Prototyp-Anwendung mit @ManagedBean auf Glassfish läuft 3, und ich habe wirklich keine Probleme mit diesem bemerkt. Ich schon gar nicht etwas dagegen von @ManagedBean zu @Named migrieren, aber ich möchte wissen, Warum sollte ich die Mühe, .

War es hilfreich?

Lösung

CDI über Normal JSF bevorzugt, da CDI ermöglicht JavaEE weite Dependency Injection. Sie können auch POJOs injizieren und lassen Sie sie verwaltet werden. Mit JSF können Sie nur inject eine Teilmenge von dem, was können Sie mit CDI.

Andere Tipps

Verwendung CDI.

Wie pro JSF 2.3, ist @ManagedBean deprecated . Siehe auch spec Ausgabe 1417 . Dies bedeutet, dass es nicht mehr ein Grund @ManagedBean über @Named zu wählen. Dies wurde zuerst in Mojarra 2.3.0 Beta-Version m06 implementiert.

 image description hier

eingeben

Geschichte

Der Kern Unterschied ist, @ManagedBean von JSF-Framework verwaltet und ist nur über @ManagedProperty zu einem anderen JSF Managed beans zur Verfügung. @Named wird durch Anwendungsserver (der Behälter) verwaltet über und CDI Rahmen ist über @Inject zur Verfügung, um jede Art von ein Container verwaltet Artefakt wie @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, etc. und sogar ein JSF @ManagedBean. Von der anderen Seite auf, @ManagedProperty tut nicht Arbeit in einem @Named oder einen anderen Container verwaltet Artefakt. Es funktioniert wirklich nur innerhalb @ManagedBean.

Ein weiterer Unterschied besteht darin, dass tatsächlich CDI Proxies Delegieren der aktuellen Instanz im Zielbereich einspritzt auf einer Pro-Anfrage / Thread-Basis (wie als wie EJBs injiziert worden ist). Dieser Mechanismus ermöglicht es in einer Bohne eines breiteren Anwendungsbereich eine Bohne von einem engeren Rahmen Injektion, was nicht möglich mit JSF @ManagedProperty ist. JSF „spritzt“ hier die physikalische Instanz direkt durch einen Setter aufgerufen wird (die auch genau deshalb ein Setter erforderlich ist, während das ist nicht mit @Inject erforderlich).

Zwar nicht direkt ein Nachteil - es andere Wege gibt - der Umfang des @ManagedBean ist einfach begrenzt. Aus der anderen Perspektive, wenn man „zu viel“ für @Inject nicht verfügbar machen möchten, können Sie auch Ihre verwalteten Bohnen @ManagedBean einfach weiter. Es ist wie protected gegen public. Aber das ist nicht wirklich zählen.

Zumindest in JSF 2.0 / 2.1, der große Nachteil von CDI JSF Träger Bohnen Verwaltung ist, dass es keine CDI Äquivalent @ViewScoped. Die @ConversationScoped nahe kommt, erfordert aber immer noch manuell starten und stoppen und es fügt ein hässlichen cid Anforderungsparameter zu Ergebnis URLs. MyFaces CODI macht es ganz einfacher durch die transparente JSF des javax.faces.bean.ViewScoped zu CDI Überbrückung, so dass Sie nur @Named @ViewScoped tun können, aber dass eineine hässlichen windowId Anforderungsparameter zu Ergebnis URLs anhängt, auch auf Plain-Vanilla-Seite-zu-Seite-Navigation. OmniFaces löst dies alles mit einem echten CDI @ViewScoped , die wirklich der zu einem beliebigen Anfrage statt Parametern Umfang JSF Ansichtszustand des bean bindet.

JSF 2.2 (die 3 Jahre nach dieser Frage / Antwort freigegeben wird) bietet eine neue, vollständig CDI kompatibel @ViewScoped Anmerkung aus der Box in Geschmack von javax.faces.view.ViewScoped. 2.2 JSF kommt auch zusammen mit einem CDI-only @FlowScoped, die keine @ManagedBean Äquivalent hat, hiermit JSF Nutzer gegenüber CDI schieben. Die Erwartung ist, dass @ManagedBean und Freunde werden per Java EE 8. veraltet Wenn Sie derzeit noch @ManagedBean verwenden, ist es daher dringend CDI b zu wechseln empfehlene vorbereitet für Pfade Zukunft zu aktualisieren. CDI ist in Java EE Web Profile kompatibel Behälter, wie Wildfly, TomEE und Glassfish leicht verfügbar. Für Tomcat, müssen Sie es separat installieren, genau so, wie Sie bereits für JSF tat. Siehe auch Wie installiert CDI in Tomcat?

Mit Java EE 6 und CDI haben Sie verschiedene Optionen für Managed Beans

  • @javax.faces.bean.ManagedBean ist auf JSR 314 beziehen und wurde mit JSF 2.0 eingeführt. Das Hauptziel war es, die Konfiguration in der faces-config.xml-Datei zu vermeiden, dass die Bohnen innerhalb einer JSF Seite zu verwenden.
  • @javax.annotation.ManagedBean(“myBean”) ist definiert durch JSR 316. Es verallgemeinert die JSF Bohnen verwaltet für den Einsatz an anderer Stelle in Java EE
  • @javax.inject.Named(“myBean”) sind fast die gleichen, wie die oben, außer dass Sie eine beans.xml Datei im Web / WEB-INF-Ordner müssen CDI aktivieren.

Ich war mit CDI in Glassfish 3.0.1, aber bekommen es ich zur Arbeit hatte die Naht 3 Rahmen (Weld) zu importieren. Das funktionierte ziemlich gut.

In Glassfish 3.1 CDI aufgehört zu arbeiten, und die Schweißnaht gestoppt, damit zu arbeiten. Ich öffnete einen Fehler auf dieser aber habe es nicht fixiert noch nicht gesehen. Ich hatte alle meine Codes mit dem javax.faces zu konvertieren. * Anmerkungen aber ich plane zu CDI zurück zu bewegen, wenn sie es bekommen zu arbeiten.

Ich bin damit einverstanden Sie CDI benutzen sollten, aber ein Problem, dass ich noch nicht behoben ist gesehen, was mit der @ViewScoped Anmerkung zu tun. Ich habe eine Menge von Code, der davon abhängt. Es ist nicht klar, ob @ViewScoped funktioniert, wenn Sie nicht @ManagedBean mit ihm arbeiten. Wenn jemand dies klären kann ich würde es zu schätzen wissen.

Ein guter Grund zu CDI zu bewegen: Sie haben eine gemeinsame Sitzung-scoped Ressource haben könnten (Benutzerprofil zum Beispiel) in beide JSF Managed Beans und REST-Service @Inject'ed (dh Jersey / JAX-RS)

Auf der anderen Seite ist @ViewScoped ein zwingender Grund mit JSF @ManagedBean zu bleiben - vor allem für alles, was mit erheblichem AJAX. Es gibt keinen Standard-Ersatz für den in CDI.

Es scheint, dass es für CDI Bohnen eine gewisse Unterstützung für eine @ViewScoped artige Anmerkung haben kann, aber ich habe nicht mit ihm persönlich gespielt.

http://seamframework.org/Seam3/FacesModule

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top