Question Injecter un EJB dans un convertisseur JSF avec JEE6 [dupliquer]


Cette question a déjà une réponse ici:

J'ai un EJB sans état qui accède à ma base de données. J'ai besoin de ce bean dans un convertisseur JSF 2 pour retrouver un objet d'entité à partir du paramètre de valeur String. J'utilise JEE6 avec Glassfish V3.

@EJB L'annotation ne fonctionne pas et obtient un NPE, car il se trouve dans le contexte des faces et n'a pas accès au contexte EJB.

Ma question est: Est-il encore possible d'injecter ce haricot avec un @Resource ou une autre annotation, ou une recherche JNDI, ou ai-je besoin d'une solution de contournement?


Solution

Effectuez une recherche JNDI comme ceci:

  try {
   ic = new InitialContext();
   myejb= (MyEJB) ic
     .lookup("java:global/xxxx/MyEJB");   
  } catch (NamingException e) {
   e.printStackTrace();
  }

12
2018-01-07 10:12


origine


Réponses:


Je n'ai jamais utilisé JSF 2.0 (seulement 1.0), mais le chapitre 5.4 de la spécification dit:

[...] permet au conteneur d'injecter des références à   Les ressources gérées par conteneur dans une instance de bean géré avant d'être rendues accessibles à l'application JSF.   Seulement des haricots déclaré être en demande,   session ou domaine d'application sont   permettre l'injection de ressources.

Mais jusqu’à présent, une recherche JNDI devrait faire l'affaire.


6
2018-01-07 10:41



Une autre solution (mais pas si jolie) peut utiliser la liaison au lieu de converterId. Utilisation des beans gérés par JSF uniquement:

<f: converter binding = "# {app.personConverter}" />

Où appBean représente quelque chose comme: @ManagedBean(name="app") @ApplicationScoped class AppBean { @EJB private PersonService ps; private Converter personConverter; }

Il peut y avoir une meilleure solution dans le style CDI (JSR-299) mais j'ai échoué faire fonctionner celui-ci:

<f: converter binding = "# {cdiBean}" />

Où cidBean devrait être: @Named class CdiBean implements Converter { @EJB ... }

Échec avec 'Comportement par défaut invoqué pour exiger un ID de convertisseur transmis au constructeur'

Quoiqu'il en soit, la première approche utilisant la liaison et les applications JSF bean travaux.


2
2018-01-31 09:19



L'extension Seam Faces pour JSF 2.0 et CDI permet la prise en charge de @Inject directement dans les validateurs et les convertisseurs.

Vérifiez-le: http://ocpsoft.com/java/seam-faces-3-0-0-alpha2-jsf-2-0-just-got-even-easier/


2
2018-06-14 22:29



Je ne sais pas si cette solution est jolie ... mais ça marche:

@ManagedBean
public class AcquisitionConverter implements Converter
{
    @EJB
    private AcquisitionService service;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        ...
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        ...
    }
}

et

<h:inputText value="#{flowController.acquisition}" converter="#{acquisitionConverter}">

avec jsf 2.1.3 (mojarra) et fishfish 3.1.1


2
2018-01-19 00:36