Comment injecter @EJB, @PersistenceContext, @Inject, @Autocâblés, etc dans @FacesConverter?
Comment puis-je injecter une dépendance comme @EJB
, @PersistenceContext
, @Inject
, @AutoWired
, etc dans un @FacesConverter
? Dans mon cas précis j'ai besoin d'injecter un EJB via @EJB
:
@FacesConverter
public class MyConverter implements Converter {
@EJB
protected MyService myService;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
//myService.doSomething
}
}
Cependant, il n'a pas injecté et il reste null
, résultant dans des Npe. Il semble que @PersistenceContext
et @Inject
aussi ne fonctionne pas.
Comment puis-je injecter une dépendance de service dans mon convertisseur afin que je puisse accéder à la DB?
Vous devez vous connecter pour publier un commentaire.
Non, pas jusqu'à ce que JSF 2.3. La JSF/CDI gars travaillent sur que pour le JSF 2.3. Voir aussi JSF éd. 1349 et ce "Ce qui est nouveau dans JSF 2.3?" article de mon camarade Arjan Tijms. Alors seulement l'injection de dépendance comme
@EJB
,@PersistenceContext
,@Inject
, etc dans une@FacesConverter
lorsque vous ajoutez explicitementmanaged=true
attribut à l'annotation.Avant JSF 2.3, vous avez plusieurs options:
Faire un managed bean à la place. Vous pouvez faire un JSF, CDI ou au Printemps bean géré par
@ManagedBean
,@Named
ou@Component
. L'exemple ci-dessous fait un managed bean JSF.Et l'exemple ci-dessous fait un CDI managed bean.
De référence comme
<h:inputXxx converter="#{yourConverter}">
au lieu de<h:inputXxx converter="yourConverter">
, ou comme<f:converter binding="#{yourConverter}">
au lieu de<f:converter converterId="yourConverter">
. N'oubliez pas de retirer le@FacesConverter
annotation!L'inconvénient est que vous ne pouvez pas spécifier
forClass
et ont donc besoin de définir manuellement le convertisseur partout là où il faut.L'injecter dans un managed bean à la place.
Et dans votre convertisseur, attraper ou appeler par l'intermédiaire de EL.
De cette façon, vous pouvez continuer à l'utiliser
@FacesConverter
.Manuellement saisir l'EJB de JNDI.
L'inconvénient, c'est qu'il y a un risque certain que ce n'est pas entièrement portable. Voir aussi Injecter de l'EJB haricot de la JSF bean géré par programmation.
Installer OmniFaces. Depuis la version 1.6, en toute transparence, il ajoute le support pour
@EJB
(et@Inject
) dans un@FacesConverter
sans aucune autre modification. Voir aussi la vitrine. Si vous avez besoin de le convertisseur<f:selectItem(s)>
, alors l'alternative est d'utiliser sonSelectItemsConverter
qui va automatiquement effectuer le travail de conversion basés sur des éléments sans le besoin pour n'importe quelle base de données d'interaction.Voir aussi Erreur de Conversion valeur de réglage pour la valeur 'null Converter".
Voir aussi:
@EJB
à@FacesValidator
et@FacesConverter
UISelectItems
de laUIComponent
, puis itérer sur cette liste sélectionner un élément et de trouver la valeur? Je veux dire, vous avez besoin d'une injection ou d'envoyer la requête à la base de données (si la question n'est pas clair je peux commencer une nouvelle question avec un exemple)La réponse est Oui, si vous pouvez supporter de Couture Visages module dans votre application web. Veuillez vérifier ce post L'Injection de l'EntityManager CDI ou Haricot FacesConverter. Vous pouvez utiliser @EJB de manière similaire.
Vous pourriez accéder indirectement à travers FacesContext, qui est un paramètre à la fois Convertisseur méthodes.
Le convertisseur peut être également annoté CDI Nommé à la portée de l'Application. Lors de l'accès à la façade, les deux instances de la même classe sont utilisés. L'un est le convertisseur de l'instance elle-même, muet, sans savoir EJB annotation. Une autre instance conserve la portée de l'application et peut être consulté via le FacesContext. Cette instance est un objet Nommé, donc il sait de l'EJB annotation. Car tout est fait en une seule classe, l'accès pourrait être maintenues à l'abri.
Voir l'exemple suivant:
Cela ne fonctionne qu'au moins Java EE 7 et CDI 1.1 serveur:
https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/CDI.html
https://stackoverflow.com/a/33017416/5626568
Par Luis Chacon, Sv
Fonctionne très bien, testé
définition des EJB :
définir bean avec l'Application de haricots portée, pour obtenir l'Objet d'EJB
finale de l'Accès aux Ejb Objet de Convertisseur: