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 :

Pas d'injection d'EJB


Sujet :

Java EE

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 958
    Points : 213
    Points
    213
    Par défaut Pas d'injection d'EJB
    salut,

    je suis un livre d'A.Goncalves sur Java EE6 et glassfish v3 mais j'ai des problèmes.
    j'ai pour but de créer un projet maven contenant un EJB, une entity JPA, et une classe main.
    j'ai créé la classe entité (la voici

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package lorry.librairie6_ejbproject;
     
    import java.io.Serializable;
    import javax.persistence.Entity;
    import javax.persistence.EntityManager;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.PersistenceContext;
     
    /**
     *
     * @author lolveley
     */
    @Entity
    public class Car implements Serializable {
     
     
     
     
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
     
        public Long getId() {
            return id;
        }
        private String name;
     
        /**
         * Get the value of name
         *
         * @return the value of name
         */
        public String getName() {
            return name;
        }
     
        /**
         * Set the value of name
         *
         * @param name new value of name
         */
        public void setName(String name) {
            this.name = name;
        }
     
     
        public void setId(Long id) {
            this.id = id;
        }
     
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (id != null ? id.hashCode() : 0);
            return hash;
        }
     
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Car)) {
                return false;
            }
            Car other = (Car) object;
            if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
                return false;
            }
            return true;
        }
     
        @Override
        public String toString() {
            return "lorry.librairie6_ejbproject.Car[id=" + id + "]";
        }
     
    }
    et la classe EJB (qui accède à la classe JPA via l'injection d'entitymanager) :

    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
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package ejb;
     
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import lorry.librairie6_ejbproject.Car;
     
    /**
     *
     * @author lolveley
     */
    @Stateless
    public class CarManager implements CarManagerRemote {
     
         @PersistenceContext(unitName="lorry.17082010_librairie6_EJBProject_ejb_1.0-SNAPSHOTPU")
        EntityManager em;
     
     
        public Car save(Car car) {
     
            em.persist(car);
            return car;
        }
     
        public Car find(Long id) {
            return em.find(Car.class, id);
        }
     
        // Add business logic below. (Right-click in editor and choose
        // "Insert Code > Add Business Method")
     
    }
    jusque-là, rien de très dur.

    voici la classe main , qui est censée accéder à l'EJB par 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package start;
     
    import ejb.CarManagerRemote;
    import javax.ejb.EJB;
    import lorry.librairie6_ejbproject.Car;
     
    /**
     *
     * @author lolveley
     */
    public class Start {
     
        @EJB
        private static CarManagerRemote carManager;
     
     
     
        public static void main(String[] args){
     
            Car firstCar=new Car();
            firstCar.setId(0L);
            firstCar.setName("citroën");
            carManager.save(firstCar);
            System.out.println("c fait");
     
     
     
        }
     
     
     
    }
    et quand je lance le projet (je suis sous netbeans) j'ai un message nullpointerexception, au niveau où j'appelle la méthode save.
    donc pas d'EJB Car en vue.

    pouvez-vous m'aider?

    voici le pom.xml :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <artifactId>librairie3_chap06</artifactId>
            <groupId>lorry.12082010</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <groupId>lorry.17082010</groupId>
        <artifactId>librairie6_EJBProject</artifactId>
        <packaging>jar</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>librairie6_EJBProject Java EE 6 EJB</name>
        <url>http://maven.apache.org</url>
        <dependencies>
     
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-api</artifactId>
                <version>6.0</version>
                <scope>provided</scope>
            </dependency>
     
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.2</version>
                <scope>test</scope>
            </dependency>
     
        </dependencies>
     
        <repositories>
            <repository>
                <id>java.net2</id>
                <name>Java.Net Maven2 Repository, hosts the javaee-api dependency</name>
                <url>http://download.java.net/maven/2</url>
            </repository>
        </repositories>
     
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.0.2</version>
                    <inherited>true</inherited>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                        <encoding>${project.build.sourceEncoding}</encoding>
                    </configuration>
                </plugin>
     
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.3.1</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>
                                    start.Start
                                </mainClass>
                            </manifest>
                        </archive>
     
                    </configuration>
                </plugin>
            </plugins>
     
        </build>
     
        <properties>
            <netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
     
    </project>
    ça serait très sympa de m'aider!

    olivier

  2. #2
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Bonjour,
    Je déterre le post parce que je rencontre le même soucis. J'espère qu'on pourra me répondre à moi
    Merci pour toutes vos contributions.

  3. #3
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Pour utiliser l'injection de dépendances (EJB & co) il te faut un conteneur derrière. Ce conteneur peut soit être intégré dans application (Apache Open EJB, ...) ou utilisé celui d'un serveur d'application lourd.

    Ce qu'il te faut, c'est que tu crées une application JEE de type "client" (donc un JAR qui contient un main) et le déployer sur ton serveur d'application (GlassFish en l'occurence). Evite aussi de faire de l'injection sur des variables static.

    Il faut donc générer un JAR avec un MANIFEST.MF et le déployer sur ton serveur.

  4. #4
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Je suis sous RAD et ma méthode main à moi est définie au sein d'une classe d'un projet java (j'avais aussi essayé avec un projet client mais résultat similaire) sous un ear qui contient aussi tu t'en doute un projet jpa (ejb 3.x) le tout déployé sous WebSphere. Mon projet démarre correctement, lie les interface de l'ejb session etc... je ne pense pas que ce soit ça le soucis.

    Evite aussi de faire de l'injection sur des variables static.
    ça peut venir de ça ou est ce juste une recommandation?

    Edit: J’espère que ces éléments de codes ci en bas permettrons au plus d'entre vous d'essayer de m'aider à résoudre mon problème.
    Voici donc mon ejb session:
    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
    @Stateless
    public class PublicService implements PublicServiceLocal {
     
    	@PersistenceContext(unitName = "ObjectExchangeUP")
    	private EntityManager em;
     
    	/**
             * Default constructor.
             */
    	public PublicService() {
    		// TODO Auto-generated constructor stub
    	}
     
    	public List<User> getAllUsers() {
     
    		Query query = em.createNamedQuery("findAllUsers");
     
    		return (List<User>) query.getResultList();
     
    	}
    En fait j'ai remarqué l'injection de l'entiy manager marchait correctement elle (testé avec le client de test universel)

    Et voici ma class Main objet de mes soucis actuels:
    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
    public class Main {
     
    	@EJB
    	private static PublicServiceLocal publicServiceLocal;
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Module de remplacement de méthode auto-généré
    		ArrayList<User> result = new ArrayList<User>();
     
    		if (publicServiceLocal == null)
    			System.out.println("Prob d'injection");
    		else
    			result = (ArrayList<User>) publicServiceLocal.getAllUsers();
    		System.out.println(result.size() + " résultat(s) trouvé(s)");
    		for (User u : result) {
    			System.out.println("Utilisateur trouvé: " + u.getFirstName() + " "
    					+ u.getLastName());
    		}
     
    	}
     
    }
    Comment se fait t'il que l'injection de dépendance marche d'un côté (pour l'em) et pas de l'autre (ejb session au niveau de la class Main) ?

  5. #5
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Tu as raison olivier, le fait est que ma classe Main n'est pas gérée par le conteneur qui n'a aucune raison dès lors d'instancier mon ejb session.
    La solution est comme tu dis :
    1- Soit de faire en sorte que ma classe soit le point d'entrée de l'application en renseignant ce qu'il faut sur le manifest
    2- Passer par java web start
    3- Ou encore utiliser JNDI en n'oubliant pas d'initier les propriétés qu'il faut pour récupérer un objet InitialContext adéquat

    J'ai opté quant à moi pour la création d'une servlet puisque juste pour tester.

    P.S: La spécification permet justement et de manière unique aux seules classes d'applications clientes de faire une injection sur un membre static, voir ce qui suit:

    5.2.3Annotations and Injection

    As described in the following sections, a field or method of certain container-managed component classes may be annotated to request that an entry from the application component’s environment be injected into the class. [...] For all classes except application client main classes, the fields or methods must not be static.
    [...]
    For all classes except application client main classes, the fields or methods must not be static. Because application clients use the same lifecycle as J2SE applications, no instance of the application client main class is created by the application client container. Instead, the static main method is invoked. To support injection for the application client main class, the fields or methods annotated for injection must be static.

Discussions similaires

  1. @EJB et pas d'injection.
    Par zolive dans le forum Glassfish et Payara
    Réponses: 2
    Dernier message: 06/07/2010, 00h13
  2. Jboss : Injection d'EJB dans les servlets ! @EJB
    Par MaxLaMenaX dans le forum Wildfly/JBoss
    Réponses: 12
    Dernier message: 17/09/2009, 16h41
  3. [EJB] Injecter un EJB dans un objet (annotation @EJB ?)
    Par flamant dans le forum Java EE
    Réponses: 2
    Dernier message: 03/05/2009, 08h24
  4. Injection avec @EJB depuis un tomcat seul
    Par yciabaud dans le forum Glassfish et Payara
    Réponses: 5
    Dernier message: 07/11/2008, 08h18
  5. Weblogic 10.0 : injection d'EJB dans managed bean JSF
    Par loic38_01 dans le forum Weblogic
    Réponses: 1
    Dernier message: 05/09/2008, 13h46

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