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

JPA Java Discussion :

Utilisation Facades depuis Appli Java web


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut Utilisation Facades depuis Appli Java web
    Bonjour,

    Pour commencer, je suis débutant en Java. Désolé si je ne suis pas très clair, je suis moi-même un peu perdu..

    J'ai hérité d'un projet utilisant des EJB à partir duquel j'ai créé un EJB Module dans eclipse, puis, exporté en tant que EJB JAR File pour l'inclure dans une application web. Le but étant d'exécuter des méthodes du jar depuis l'application web.

    La méthode que j'ai en face de moi est située dans une façade, utilisant elle-même d'autres façades. J'imagine que l'attribut @EJB indique au framework Hibernate qu'il faut instancier ces façades car je ne vois à aucun moment de maFacade = new MaFacade().

    Est-ce qu'il y a moyen de faire fonctionner ces façades "normalement", même depuis une application web "standard"?

    Merci d'avance pour vos lumières!

  2. #2
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Je me rend compte en relisant le post qu'il manque un peu de code.. Dans l'espoir que quelqu'un ici sache m'orienter, je vais essayé de vous expliquer un peu mieux ce qui marche et ce qui ne marche pas.

    J'ai inclus ma librairie d'EJB dans l'application web.
    J'ai rajouté une persistence-unit dans le fichier persistence.xml de l'application web (une persistence-unit existait déjà, ça en fait 2 maintenant):

    Code XML : 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
    <persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
        version="1.0">
     
    <!-- persistence-unit existante -->
        <persistence-unit name="concept" transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <properties>
                <property name="jndiName" value="java:comp/env/jdbc/concept"/>
                <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
                <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
                <!-- <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect" /> -->
                <property name="hibernate.show_sql" value="false" />
            </properties>
        </persistence-unit>
     
    <!-- nouvelle persistence-unit -->
        <persistence-unit name="CoresCalculatorUnit"
            transaction-type="RESOURCE_LOCAL">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <non-jta-data-source>java:comp/env/jdbc/CoresCalculatorDS</non-jta-data-source>
            <jar-file>cores-calculator-1.0.jar</jar-file>
            <!-- Liste des classes de la librairie -->
            <properties>
                <property name="hibernate.connection.datasource" value="java:comp/env/jdbc/CoresCalculatorDS" />
                <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
                <property name="javax.persistence.jdbc.driver"
                    value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
            </properties>
        </persistence-unit>
    </persistence>
    Dans une classe de mon application web, je réussi a instancier un EntityManager pour ma nouvelle persistence-unit, à l'utiliser pour récupérer des enregistrements:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                        EntityManagerFactory emf = Persistence.createEntityManagerFactory("CoresCalculatorUnit");
                        EntityManager em = emf.createEntityManager();
                        tender = em.find(Tender.class, idsMapping.get("DC_QUOTATION_NUMBER"));
                        LOGGER.info("Tender ID: " + tender.getDcQuotationNumber());
    Donc j'imagine que mon persistence.xml n'est pas si moche!

    Le problème est que dans cette même classe de l'appli web, j'ai tenté de rajouter un champ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        @EJB(beanName = "PrimaryCalculusBean", beanInterface = PrimaryCalculusFacade.class, description = "PrimaryCalculus Bean")
        private PrimaryCalculusFacade myPrimaryCalculusFacade;
    ... en espérant qu'il soit instancié lors de l'instantiation de ma classe (comme dans un projet EJB normal, non?) mais ça ne fonctionne pas, NullPointerException lors de son appel..

    Il me manque des connaissances sur le sujet, et je tourne en rond à force de pas savoir quoi chercher..

  3. #3
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Les EJB sont des objets dont le cycle de vie sont gérés par le serveur d'application (EJB container). Ils en existent plusieurs types (session, message).
    Hibernate est une implémentation JPA. Cette dernière est un service fourni par les serveurs d'applications et qui gère la persistance via une base de données relationnelles. Les objets manipulés sont normalement appelés Entity. Ces objets sont gérés par JPA mais les ressources liées (connexion et transaction) sont gérées par le serveur d'application.

    Tu peux soit gérer les EJB dans un "super" Tomcat (ex : TomEE) ou bien remplacer la couche JEE par Spring Framework ou autre.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  4. #4
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Citation Envoyé par Logan Mauzaize Voir le message
    Les EJB sont des objets dont le cycle de vie sont gérés par le serveur d'application (EJB container). Ils en existent plusieurs types (session, message).
    Hibernate est une implémentation JPA. Cette dernière est un service fourni par les serveurs d'applications et qui gère la persistance via une base de données relationnelles. Les objets manipulés sont normalement appelés Entity. Ces objets sont gérés par JPA mais les ressources liées (connexion et transaction) sont gérées par le serveur d'application.
    De ce que je comprend, c'est la raison pour laquelle je peux utiliser l'EntityManager mais que les EJB ne sont pas injectés.

    Citation Envoyé par Logan Mauzaize Voir le message
    Tu peux soit gérer les EJB dans un "super" Tomcat (ex : TomEE) ou bien remplacer la couche JEE par Spring Framework ou autre.
    Erm! Tout ça m'a l'air lourd de conséquence.. Je n'ai pas le pouvoir de choisir le framework (une société tierce avec qui je n'ai pas de contact développe depuis des années un framework qu'ils vendent à mon client - je suis là seulement pour faire des changements "mineurs").

    Est-ce que passer de Tomcat à TomEE nécéssite de revoir une partie du code déjà produit? (je ne sais pas si tu sais répondre sans voir le code..)

    Merci pour ton aide!

    Edit:

    Je viens de faire une petite recherche et j'ai une partie de la réponse.

    "Tomcat vs TomEE":

    Nom : KTaxj.png
Affichages : 119
Taille : 43,6 Ko

    De ce que je vois sur ce tableau, tout ce que fait Tomcat, TomEE le fait aussi. Est ce que cela signifie que je peux mettre TomEE sans m'inquiéter pour la comptabilité du code déjà écrit?

  5. #5
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par -N4w4k- Voir le message
    De ce que je comprend, c'est la raison pour laquelle je peux utiliser l'EntityManager mais que les EJB ne sont pas injectés.
    Si tu n'as pas de "service" pour injecter les EJB, effectivement ca ne peut pas fonctionner. EntityManager fait partie de l'API JPA dont Hibernate est une implémentation. Mais tu n'es pas obligé de tirer l'API JPA quand tu utilises Hibernate.

    Citation Envoyé par -N4w4k- Voir le message
    Erm! Tout ça m'a l'air lourd de conséquence.. Je n'ai pas le pouvoir de choisir le framework (une société tierce avec qui je n'ai pas de contact développe depuis des années un framework qu'ils vendent à mon client - je suis là seulement pour faire des changements "mineurs").
    En fait, d'où vient le code avec les EJB ? Parce que j'ai l'impression qu'il sort d'un chapeau magique ... Soit c'est du code existant, et cela ne peut pas fonctionner sur un "simple" Tomcat (et donc que tu n'utilises pas la bonne cible de déploiement pour tes développements), soit c'est du neuf et un contournement serait plus judicieux.

    Citation Envoyé par -N4w4k- Voir le message
    Est-ce que passer de Tomcat à TomEE nécéssite de revoir une partie du code déjà produit? (je ne sais pas si tu sais répondre sans voir le code..)
    Oui, TomEE (et ses "+") viennent avec des APIs et des implémentations spécifiques. A titre d'exemple, tu pourras constater que TomEE PluME vient avec EclipseLink et Mojarra qui sont respectivement des implémentations de JPA et JSF. Pour le second ce n'est pas très important si tu n'as pas déjà JSF ou que tu utilises déjà cette implémentation.
    Pour le premier c'est plus compliqué puisque tu utilises déjà Hibernate. Et d'expérience, on a souvent des parties spécifiques puisqu'on ne peut pas toujours s'en remettre à l'API JPA "standard" pour résoudre tous les problèmes.

    D'ailleurs le tableau est assez étrange puisque plusieurs APIs sont déjà mentionnés pour les autres produits mais sans spécifier les implémentations ... Mais tout ceci est détaillé sur la page de garde de TomEE :
    TomEE

    The Web Profile version of TomEE contains

    • CDI - Apache OpenWebBeans
    • EJB - Apache OpenEJB
    • JPA - Apache OpenJPA
    • JSF - Apache MyFaces
    • JSP - Apache Tomcat
    • JSTL - Apache Tomcat
    • JTA - Apache Geronimo Transaction
    • Servlet - Apache Tomcat
    • Javamail - Apache Geronimo JavaMail
    • Bean Validation - Apache BVal


    TomEE+

    The TomEE Plus distribution adds the following:

    • JAX-RS - Apache CXF
    • JAX-WS - Apache CXF
    • JMS - Apache ActiveMQ
    • Connector - Apache Geronimo Connector
    Par ailleurs toutes ces librairies tirent également (par dépendances) des implémentations différentes d'APIs fournies par Java SE (ex: JAXP, JAXB). Ce qui n'est pas sans causer quelques soucis de compatibilité entre les différentes librairies qui les utilisent.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  6. #6
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Citation Envoyé par Logan Mauzaize Voir le message
    En fait, d'où vient le code avec les EJB ? Parce que j'ai l'impression qu'il sort d'un chapeau magique ... Soit c'est du code existant, et cela ne peut pas fonctionner sur un "simple" Tomcat (et donc que tu n'utilises pas la bonne cible de déploiement pour tes développements), soit c'est du neuf et un contournement serait plus judicieux.
    C'est à la base une appli web développée par une autre équipe, comportant des fonctionnalités que l'on veut intégrer dans notre appli.
    Après avoir identifié le code métier qui m'intéresse, j'ai construit ma librairie.
    Quand tu parles de contournement, tu veux dire réécrire une partie de la couche d'accès aux données? Ne plus utiliser les EJB? Si oui, j'ai bien peur que ce ne soit pas possible dans le temps qui m'est donné vu la quantité de code qu'il y a, et sa compléxité. Sinon, je ne vois pas de quel type de contournement tu me parle.

    Citation Envoyé par Logan Mauzaize Voir le message
    Est-ce que passer de Tomcat à TomEE nécéssite de revoir une partie du code déjà produit?
    Oui, TomEE (et ses "+") viennent avec des APIs et des implémentations spécifiques. A titre d'exemple, tu pourras constater que TomEE PluME vient avec EclipseLink et Mojarra qui sont respectivement des implémentations de JPA et JSF. Pour le second ce n'est pas très important si tu n'as pas déjà JSF ou que tu utilises déjà cette implémentation.
    Pour le premier c'est plus compliqué puisque tu utilises déjà Hibernate. Et d'expérience, on a souvent des parties spécifiques puisqu'on ne peut pas toujours s'en remettre à l'API JPA "standard" pour résoudre tous les problèmes.
    Pour JSF, je ne pense pas qu'on l'utilise (je ne trouve aucun .jsf dans l'appli).

    Pour JPA, d'après Apache, TomEE and Hibernate:
    A single webapp may have many persistence.xml files and each may use whichever JPA provider it needs. [...] The default JPA provider can be changed at the server level to favor Hibernate over OpenJPA.
    Si je comprend bien, je pourrais donc garder Hibernate pour l'appli web et ma librairie d'EJB?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 19/11/2015, 15h14
  2. Problème JDIC depuis appli web
    Par Bartuk dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 03/01/2007, 17h58
  3. Passage d'une collection depuis une Appli java
    Par Florent Coulon dans le forum iReport
    Réponses: 2
    Dernier message: 09/11/2006, 11h30
  4. [AJAX/XML/JAVA] Afficher un flux de données depuis un site web
    Par chodaboy34 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/10/2006, 16h38
  5. [Interface]Executer une appli c++ depuis une application web
    Par mguinot dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 14/11/2005, 14h30

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