Wie @EJB, @PersistenceContext, @Inject, @Autowired usw. in @FacesConverter injizieren?
Wie kann ich Spritzen eine Abhängigkeit wie @EJB
@PersistenceContext
@Inject
@AutoWired
usw in einem @FacesConverter
? In meinem speziellen Fall brauche ich um zu injizieren, eine EJB über @EJB
:
@FacesConverter
public class MyConverter implements Converter {
@EJB
protected MyService myService;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
//myService.doSomething
}
}
Aber Sie hat nicht gespritzt und es bleibt null
was in NPEs. Es scheint, dass @PersistenceContext
und @Inject
auch nicht funktioniert.
Wie ich Spritzen eine service-Abhängigkeit in meinem Konverter, so dass ich Zugriff auf die DB?
InformationsquelleAutor der Frage Robert Hume | 2011-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, nicht bis JSF 2.3 ist veröffentlicht. Die JSF/CDI Jungs arbeiten an, die für JSF 2.3. Siehe auch JSF-spec Problem 1349 und in diesem Zusammenhang "Was ist neu in JSF 2.3?" Artikel meiner Kollegen Arjan Tijms. Nur dann dependency injection wie
@EJB
@PersistenceContext
@Inject
usw. werden in einem@FacesConverter
wenn Sie explizit hinzufügenmanaged=true
- Attribut der annotation.Bevor JSF 2.3, haben Sie mehrere Möglichkeiten:
Machen es zu einem managed bean statt. Sie können machen es zu einem JSF, CDI oder Spring managed bean über
@ManagedBean
@Named
oder@Component
. Das folgende Beispiel macht es eine JSF managed bean.Und das folgende Beispiel macht es eine CDI managed bean.
Referenz als
<h:inputXxx converter="#{yourConverter}">
statt<h:inputXxx converter="yourConverter">
oder als<f:converter binding="#{yourConverter}">
statt<f:converter converterId="yourConverter">
. Vergessen Sie nicht, entfernen Sie die@FacesConverter
Anmerkung!Der Nachteil ist, dass man nicht angeben
forClass
und damit die Notwendigkeit, manuell zu definieren, die Konverter überall im Blick, wo nötig.Injizieren es in einem regulären managed bean statt.
Und in Ihrem Konverter, schnappen oder rufen Sie es über EL.
Diese Weise können Sie halten mit
@FacesConverter
.Manuell greifen die von EJB JNDI.
Der Nachteil ist, dass es besteht ein gewisses Risiko, dass dies nicht ganz tragbar. Siehe auch Injizieren EJB-bean von JSF-managed-bean-programmgesteuert.
Installieren OmniFaces. Seit der version 1.6, es transparent fügt Unterstützung für
@EJB
(und@Inject
) in einem@FacesConverter
ohne jede weitere änderung. Siehe auch das Schaufenster. Wenn Sie geschehen, müssen Sie den Konverter für<f:selectItem(s)>
dann die alternative ist die Verwendung derSelectItemsConverter
wird automatisch die Konvertierung basiert auf wählen Sie die Elemente, ohne die Notwendigkeit für Datenbank-Interaktion.Siehe auch Fehler bei der Konvertierung von Wert für die Einstellung für "null-Konverter'.
Siehe auch:
@EJB
in@FacesValidator
und@FacesConverter
InformationsquelleAutor der Antwort BalusC
Die Antwort ist ja, wenn Sie Platz für Naht-Flächen-Moduls in Ihrem web-Anwendung. Bitte überprüfen Sie diese post Injektion von EntityManager oder CDI-Bean in FacesConverter. Sie können die Verwendung von @EJB in ähnlicher Weise.
InformationsquelleAutor der Antwort Karthikeyan Chockalingam
Könnte man ihn aber indirekt durch FacesContext, das ist ein parameter in beiden Methoden Konverter.
Könnte der Konverter werden auch kommentierte CDI Namens mit Application-scope. Beim Zugriff auf die Fassade, die zwei Instanzen der gleichen Klasse eingesetzt werden. Ist der converter-Instanz selbst, stumm, ohne zu wissen, EJB-annotation. Eine andere Instanz behält, Anwendungsbereich und zugegriffen werden konnte über den FacesContext. Diese Instanz ist ein Benanntes Objekt, damit Sie weiß, dass das EJB-annotation. Als alles fertig ist, in eine einzige Klasse, die Zugriff gehalten werden konnte, geschützt.
Siehe das folgende Beispiel:
InformationsquelleAutor der Antwort Pavel Sedek
Funktioniert dies nur, wenigstens Java EE 7 und CDI 1.1 server:
https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/CDI.html
https://stackoverflow.com/a/33017416/5626568
InformationsquelleAutor der Antwort ℛɑƒæĿ
Durch Luis Chacon, Sv
Funktioniert einwandfrei, getestet
definition EJB :
definieren bean mit der Aplication-bean-scope, für Holen Sie die EJB-Objekt
Letzte Zugriff auf Ejb-Objekt aus dem Konverter:
InformationsquelleAutor der Antwort Luis Chacon