IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

Problème avec les Bean Remote JEE


Sujet :

Java EE

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Problème avec les Bean Remote JEE
    Bonjour à tous,

    J'ai décidé de faire une petite application en archi n-tiers et je rencontre un problème qui est récurrent sur le web. Malgré un bon nombre de posts existant sur le web, je crois ne pas encore avoir trouvé la solution... Pour info, j'utilise JBOSS AS 7.1.1 et JAVA 1.7.

    L'application se divise en 3 projets: projet jpa, projet business et projet web.

    Voici un exemple de classe JPA que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @Entity
    @NamedQuery(name="Stream.findAll", query="SELECT s FROM Stream s")
    public class Stream implements Serializable {
    	private static final long serialVersionUID = 1L;
     
    	@Id
    	@Column(name="id_stream")
    	private int idStream;
     
    	private String description;
     
    	private String name;
     
    	public Stream() {
    	}
     
            ...
    }
    J'ai mes classes dite business qui s'occupe du traitement métier. Ce sont des Beans qui manipule Les classes JPA par le biais du fameux Entity Manager.
    Voici l'interface:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Remote
    public interface StreamServiceRemote {
     
    	public List<Stream> getHomeStreams();
    }
    Voici la classe implémentant l'interface:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @Stateless(name="StreamService")
    public class StreamService implements StreamServiceRemote {
     
    	@PersistenceContext(unitName="jpa")
    	EntityManager em;
     
        public StreamService() {
     
        }
     
    	public List<Stream> getHomeStreams() {
     
    		Query q = em.createQuery("SELECT s FROM "+Stream.class.getName()+" s");
    		List<Stream> results = (List<Stream>) q.getResultList();
    		return results;
    	}
     
    }
    La problématique vient de mon projet Jax-RS qui n'injecte pas correctement mon Bean à l'aide de l'annotation @EJB.
    Voici un exemple d'injection:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @Stateless
    @Path("home")
    public class HomeController {
     
    	@EJB
    	private StreamServiceRemote streamService;
     
    	@GET
    	@Path("")
    	public Viewable index(@Context HttpServletRequest request, @Context HttpServletResponse response) {
     
    		List<Stream> listStream = streamService.getHomeStreams();
    		request.setAttribute("listStream", listStream);
    		return new Viewable("/home", null);
    	}
     
    }
    A savoir que quand je lance mon serveur jboss, je n'ai pas d'erreur apparente et les EJB sont bien pris en compte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    11:29:06,431 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-4) JNDI bindings for session bean named StreamService in deployment unit subdeployment "business.jar" of deployment "ear.ear" are as follows:
     
    	java:global/ear/business/StreamService!com.popme.business.remote.StreamServiceRemote
    	java:app/business/StreamService!com.popme.business.remote.StreamServiceRemote
    	java:module/StreamService!com.popme.business.remote.StreamServiceRemote
    	java:jboss/exported/ear/business/StreamService!com.popme.business.remote.StreamServiceRemote
    	java:global/ear/business/StreamService
    	java:app/business/StreamService
    	java:module/StreamService
    L'erreur qui pose problème est un simple NullPointer Exception lors de la manipulation de "private StreamServiceRemote streamService;" dans mon projet Jax-RS.

    Merci de vos réponses

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Tu n'as pas pris le bon attribut pour ton ejb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Stateless(mappedName="StreamService")
    il faudrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @Stateless(name="StreamService")
    Un autre truc qui me choque, @Stateless + @ManagedBean
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    J'ai donc remplacé "mappedName" par "name" et enlever le ManagedBean. Et même résultat.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Comment appels-tu HomeController ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    J'accède à l'adresse suivante de mon webservice:

    http://127.0.0.1:8080/web/home

    et ça me retourne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    java.lang.NullPointerException
    	com.popme.web.controller.HomeController.index(HomeController.java:32)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	java.lang.reflect.Method.invoke(Method.java:606)
    	com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:156)
    	com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
    	com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:166)
    	com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:74)
    	com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:114)
    	com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:66)
    	com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:709)
    	com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:667)
    	com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:658)
    	com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:318)
    	com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:425)
    	com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:751)
    	com.sun.jersey.spi.container.servlet.ServletContainer.doFilter(ServletContainer.java:703)
    note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de JBoss Web/7.0.13.Final.
    Sans l'appel du bean dans la classe HomeController, j'ai évidemment le comportement "normal". J'ai bien ma page web.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Pourquoi tu as les 2 annotations ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Stateless
    @Path("home")
    @Path devrait suffire
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    C'est exact. Mais je ne vois pas trop le lien avec la non instanciation de mon Bean via l'annotation @EJB :/

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Je ne vois pas trop non plus... mais comme je ne sais pas dans quel conteneur tourne ce code, il se pourrait qu'il ne prenne pas en charge ces annotations.
    Dans un conteneur de servlet -> OK
    Dans un conteneur EJB -> OK
    Mais la classe Jax-RS tourne dans quoi ?

    Enfin bref, n'étant pas un spécialiste de Jax-RS, je ne sais pas trop...
    Pour contourner ton problème, tu peux toujours faire un lookup pour récupérer l'EJB
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Justement, je pensais qu'en mettant le mode @Stateless, ma classe "controller" de mon projet jax-rs (HomeController) serait gérée par le conteneur EJB.

    Je regarde pour ta solution alternative.

    Merci.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Peut-être ce lien pourra t'aider: https://developer.jboss.org/thread/228139?_sscc=t

  11. #11
    Membre actif
    Homme Profil pro
    Développeur Java/JavaEE
    Inscrit en
    Août 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java/JavaEE

    Informations forums :
    Inscription : Août 2014
    Messages : 194
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Je te passe une bonne pratique pour manipulé les EJB Remote:

    Cette classe te permet de chercher le proxy et de le stocké pour ne pas le charger à chaque fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    package client.locator;
     
    import java.util.HashMap;
    import java.util.Map;
     
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
     
    public class ServiceLocator {
     
    	private static ServiceLocator instance;
     
    	public synchronized static ServiceLocator getInstance() {
    		if (instance == null) {
    			instance = new ServiceLocator();
    		}
    		return instance;
    	}
     
    	private Context context;
    	private Map<String, Object> cache;
     
    	private ServiceLocator() {
    		cache = new HashMap<String, Object>();
    		try {
    			context = new InitialContext();
    		} catch (NamingException e) {
    			throw new ServiceLocatorException(e);
    		}
    	}
     
    	public synchronized Object getProxy(String jndiName){
    		Object proxy = null;
    		proxy = cache.get(jndiName);
    		if(proxy == null){
    			try {
    				proxy = context.lookup(jndiName);
    			} catch (NamingException e) {
    				throw new ServiceLocatorException(e);
    			}
    			cache.put(jndiName, proxy);
    		}
    		return proxy;
    	}
     
    }
    La c'est ou on récupère l'exception s'il en a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class ServiceLocatorException extends RuntimeException {
     
    	private static final long serialVersionUID = 6744464404205649419L;
    	public ServiceLocatorException(Throwable cause) {
    		super(cause);
    	}
     
    }
    Et la c'est comment l'exploité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class UserServiceDelegate  {
     
    	private static final String jndiName = "ejb:project/project-ejb/UserService!services.UserServiceRemote";
     
    	public static UserServiceRemote getProxy(){
    		return (UserServiceRemote) ServiceLocator.getInstance().getProxy(jndiName);
    	}
     
    	public static void create(User user) {
    		getProxy().create(user);
    	}
     
    	public static User authenticate(String login, String password) {
    		return getProxy().authenticate(login, password);
    	}
     
    	public static List<Employee> findEmployees() {
    		return getProxy().findEmployees();
    	}
     
    	public static List<User> findUsers() {
    		return getProxy().findUsers();
    	}
     
    }
    Et pour les testes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class CreateSomeUsers {
     
    	public static void main(String[] args) {
     
    		Employee jean = new Employee("jean", "azerty", "jean@world.fr");
    		Employee john = new Employee("john", "qwerty", "john@world.co.uk");
     
    		Admin admin = new Admin("system", "system", 1);
     
    		UserServiceDelegate.create(jean);
    		UserServiceDelegate.create(john);
    		UserServiceDelegate.create(admin);
     
    	}
     
    }

  12. #12
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    heps,

    Si le sujet est toujours d'actu, j'ai eu un problème identique.
    Il faut bien sur laisser ton annotation "stateless" si tu souhaites que le conteneur gére son instanciation.
    Il faut aussi rajouter ton service restFull (dans mon exemple c'est EmployeeResource) dans la classe qui hérite de la classe Application.

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    @ApplicationPath("/")
    public class BackOfficeApplication extends Application {
     
        private Set<Object> singletons = new HashSet<>();
        private Set<Class<?>> classes = new HashSet<>();
     
        public BackOfficeApplication() {
        	classes.add(EmployeeResource.class);
        }
     
        @Override
        public Set<Class<?>> getClasses() {
            return classes;
        }
     
        @Override
        public Set<Object> getSingletons() {
            return singletons;
        }
     
    }

Discussions similaires

  1. GAE-JEE, problème avec les Google Charts au déploiement
    Par Gogochou dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 28/04/2015, 12h24
  2. Problème avec les beans
    Par opium1er dans le forum JSF
    Réponses: 5
    Dernier message: 29/06/2013, 01h40
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 17h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 16h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo