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 :

Choix de technologies pour un projet web


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Par défaut Choix de technologies pour un projet web
    Salut,
    Alors dans les grandes lignes, j'essaie de faire un projet avec des technologies que je maitrise plus ou moins, sachant que je tente de le faire avec les dernières versions.
    Du coup, cela donne du struts 2 pour la partie web. Après je tente une assco ejb 3/hibernate. C'est là que je me pose une petite question.
    J'aurais des ejb entity et des sessions qui vont communiquer avec mes DAO (sans doute une DaoFactory).

    Je me demande est ce que je tape ensuite côté action directement dans les ejb, ou est ce que je cree des classes services.
    Enfin, quel serait la solution la plus propre. Je recherche un modèle d'architecture propre et fiable en gros

    ...+ est ce que je différencie les entity des pojo métiers. Je suppose que oui...

    Merci

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Par défaut
    2 petites questions.
    Je n'arrive pas à lancer l'appli via l'ear :

    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
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011448: Failed to parse "/C:/install_jboss/7.1.1.Final/standalone/deployments/ikEAR.ear/ikBO.jar/META-INF/persistence.xml"
    	at org.jboss.as.jpa.processor.PersistenceUnitParseProcessor.parse(PersistenceUnitParseProcessor.java:222)
    	at org.jboss.as.jpa.processor.PersistenceUnitParseProcessor.handleJarDeployment(PersistenceUnitParseProcessor.java:100)
    	at org.jboss.as.jpa.processor.PersistenceUnitParseProcessor.deploy(PersistenceUnitParseProcessor.java:84)
    	at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
    	... 5 more
    Caused by: com.ctc.wstx.exc.WstxParsingException: Received non-all-whitespace CHARACTERS or CDATA event in nextTag().
     at [row,col {unknown-source}]: [13,54]
    	at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
    	at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
    	at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:464)
    	at com.ctc.wstx.sr.BasicStreamReader.nextTag(BasicStreamReader.java:1137)
    	at org.jboss.as.jpa.puparser.PersistenceUnitXmlParser.parseProperties(PersistenceUnitXmlParser.java:293)
    	at org.jboss.as.jpa.puparser.PersistenceUnitXmlParser.parsePU(PersistenceUnitXmlParser.java:232)
    	at org.jboss.as.jpa.puparser.PersistenceUnitXmlParser.parse(PersistenceUnitXmlParser.java:122)
    	at org.jboss.as.jpa.processor.PersistenceUnitParseProcessor.parse(PersistenceUnitParseProcessor.java:217)
    	... 8 more
    J'ai tenté de mettre le persistence.xml au niveau du meta-inf de l'ear, mais ce n'est pas mieux.
    La tête de mon persistence.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
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence>
    	<persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
    		<class>com.ik.ejb.entity.user.UserEntity</class>
    		<properties>
    			<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
    			<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
    			<property name="hibernate.connection.username" value="sa" />
    			<property name="hibernate.connection.password" value="" />
    			<property name="hibernate.connection.url" value="jdbc:hsqldb:file:database/ikDataBase" />
    			<property name="hibernate.max_fetch_depth" value="3" />
    			<property name="hibernate.hbm2ddl.auto" value="update" />
    			<property name="hibernate.connection.shutdown">true</property>
    		</properties>
    	</persistence-unit>
    </persistence>
    Si quelqu'un voit le hic...

    Deuxièment, je suis parti sur mon idée, des dao et des ejb dans un projet ejb. A présent, je voudrais appeler mes ejb au niveau de mes actions struts 2. Si quelqu'un a un bout de code approchant sachant que j'utilise jboss 7.1, ejb 3.1

    Merki

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 36
    Par défaut
    Pour ton erreur : j'ai un doute, mais la dernière propriété de ton persistence.xml me parait anormale. Ce devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.connection.shutdown" value="true" />
    (valeur en attribut, et non comme contenu de la balise).

    De manière plus générale, sur tes questions d'archi : oublie l'idée de séparer entités et objets métier. Rajoute tes annotations directement, et basta. S'il commence à y avoir trop de code métier sur tes objets et que la classe devient trop longue, tu pourras toujours le scinder en deux : faire une super-classe abstraite avec juste les données et les annotations JPA, et une classe fille (qui sera celle référencée partout dans l'appli) avec le code métier. Honnêtement, j'ai rarement ressenti le besoin de le faire. En séparant entity et objet métier dès le début, tout ce que tu gagnes c'est une méthode inutile pour copier-coller le contenu de l'une dans l'autre. C'est essentiellement un vieil héritage de l'époque des EJB Entity de J2EE 1.4 où tu n'avais pas le choix (point de détail : on JEE 5, on dit Entity, pas EJB Entity).

    Pareil pour la couche de Service : est-ce qu'il y a vraiment un besoin ? Ç'a été une mode pendant longtemps, de multplier les couches superposées, et ça n'a jamais réussi à empêcher que les problématiques d'une couche remontent à celle du dessus (par contre, pour s'assurer que la moindre évolution fonctionnelle demande trois fois plus de changements, ça marche nickel).

    Dernier point : ton DAO contient quoi ? Si tu utilises l'EntityManager, tu peux te contenter d'un DAO générique pour toutes tes classes pour les méthodes CRUD, et n'avoir de classes spécifiques que pour les requêtes un peu plus élaborées (recherches ou mises à jour en masse).

    Bref : fais simple.

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Par défaut
    Salut et merci.
    Exact le problème venait bien de cette balise. La propriété value est intégrée à la balise. Je l’avais corrigé un peu plus tôt. J’ai aussi mis une référence au xsd.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="UTF-8"?>
    <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">

    En ce qui concerne les classes, tu as raison, autant se passer du pojo puisque l’entity fait le "même" job. Si j'en éprouve le besoin, je partirai sur ton idée d'abstraction.

    Ouais pour les services, je ne pense pas en avoir l'utilité pour l'instant. Mais ca serait histoire de pas taper directement sur l'ejb. Est ce que cela a un sens ? J'en sais rien. J'avais bossé sur un projet scindé un peu comme cela. Donc il y a peut être l'envie de repomper un truc de ce côté inconsciemment.

    Mes DAO seront scindés par "service", et reprendront donc les méthodes CRUD standards, plus quelques méthodes un peu plus tordues..., enfin complexes
    Ouais j'essaierai sans doute d'adopter ton approche. J'avais aussi l'idée d'une factory.

    Mais bon pour l'instant, je suis parti dans l'idée de faire un test avec un select, de traverser les différentes couches. En ressort l'inutilité du pojo qui fait doublons avec l'Entity.

    Je bute sur l'injection de l'ejb au niveau de l'action. J'ai vu que le lookup n'était pas tout à fait standard avec JBoss 7. Il y a aussi un plugin ejb3struts2.

    Mais enfin, si quelqu'un a un appel ejb 3 dans une action struts 2, je prends.

    Merci

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Par défaut
    Je n'arrive pas à taper dans mon ejb. Je l'ai fait de deux façons. Alors ci-dessous, ma classe
    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
    /**
     * Session Bean implementation class UserBean
     */
    @Stateless(mappedName = "UserBean")
    @LocalBean
    public class UserBean implements UserRemote, UserLocal {
     
        /**
         * Default constructor. 
         */
        public UserBean() {
            // TODO Auto-generated constructor stub
        }
     
    	/**
             * @see com.iwk.ejb.session.user.UserRemote#login(java.lang.String, java.lang.String)
             * @param email
             * @param password
             * return an UserEntity if exist or null
             */
    	@Override
    	public UserEntity login(String email, String password) {
    		UserDao myUserDao = new UserDaoImpl();
    		return myUserDao.login(email, password);
    	}
     
    }
    et mes interfaces
    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
    import javax.ejb.Remote;
     
    import com.iwk.ejb.entity.user.UserEntity;
     
    @Remote
    public interface UserRemote {
     
    	/** 
             * @see com.iwk.ejb.session.user.UserRemote#login(java.lang.String, java.lang.String)
             * @param email
             * @param password
             * return an UserEntity if exist or null
             */
    	public UserEntity login (String email, String password);
     
    }
    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
    mport javax.ejb.Local;
     
    import com.iwk.ejb.entity.user.UserEntity;
     
    @Local
    public interface UserLocal {
     
    	/**
             * @see com.iwk.ejb.session.user.UserRemote#login(java.lang.String, java.lang.String)
             * @param email
             * @param password
             * return an UserEntity if exist or null
             */
    	public UserEntity login (String email, String password);
     
    }
    On en arrive à l'action, sachant que j'ai tenté 2 trucs différents :

    1 -
    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
    		final Hashtable jndiProperties = new Hashtable();
    		jndiProperties.put(Context.URL_PKG_PREFIXES,
    		"org.jboss.ejb.client.naming");
    		final Context context = new InitialContext(jndiProperties);
    
    		final String appName = "";
    
    		final String moduleName = "iWBO";
    		// THIS IS THE NAME OF THE JAR WITH YOUR EJBs. Write its name here, without the .jar.
    
    		final String distinctName = "";
    		//&nbsp;&nbsp; &nbsp;AS7 allows deployments to have an distinct name. If you don't use this feature, let this field empty.
    
    		final String beanName = UserBean.class.getSimpleName();
    		System.out.println("beanName : " + beanName);
    		//EJB CLASS WITH THE IMPLEMENTATION (simple name)
    
    		final String viewClassName = UserRemote.class.getName();
    		// FULLY QUALIFIED NAME OF THE REMOTE CLASS (interface).
    
    		UserRemote bean = (UserRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
    
    		
    		bean.login("email", "password");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1234567891011121314151617
    
    avec au niveau du build path du projet web, jboss-ejb-client.properties
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12345678
     
    remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
     
    remote.connections=default
     
    remote.connection.default.host=localhost
    remote.connection.default.port = 4447
    remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
    Cela me remonte :
    javax.naming.NameNotFoundException: UserBean/local -- service jboss.naming.context.java.UserBean.local org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97) org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178) org.jboss.as.naming.InitialContext.lookup(InitialContext.java:113) org.jboss.as.naming.NamingContext.lookup(NamingContext.java:214) javax.naming.InitialContext.lookup(Unknown Source)

    et 2 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	@InjectEJB(name="UserBean")
    	private UserBean scl;
     
    ...
    		scl.login("email", "password");
    (suppose l'ajout de struts2ejb3-jboss-plugin-0.0.4.jar)

    qui remonte également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    javax.naming.NameNotFoundException: UserBean/local -- service jboss.naming.context.java.UserBean.local
    	org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
    	org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
    	org.jboss.as.naming.InitialContext.lookup(InitialContext.java:113)
    	org.jboss.as.naming.NamingContext.lookup(NamingContext.java:214)
    	javax.naming.InitialContext.lookup(Unknown Source)
    Voilà
    Si quelqu'un peut m'expliquer ou est le probleme, quel devrait etre le nom, et sur quoi se base t il ?

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    261
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 261
    Par défaut
    problème de path. En le mettant en dur, cela passe en faisant un look up. Donc reste à voir comment récupérer l'équivalent de façon dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		Context context = new InitialContext();
    		String a = "java:jboss/exported/iWkEAR/iWkBO/UserBean!com.iwk.ejb.session.user.UserRemote";
     
            UserRemote beanRemote = (UserRemote)context.lookup(a);
     
            beanRemote.login("email", "password");

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2014, 15h53
  2. Choix des technologies pour site Web
    Par salvador.frederic dans le forum Débuter
    Réponses: 18
    Dernier message: 27/06/2013, 21h33
  3. Quel langage est le mieux adapté pour un projet web ?
    Par aztec dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 03/09/2006, 17h34
  4. Déploiement d'un état crystal report pour un projet web
    Par ddii dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 07/08/2006, 11h03
  5. Choix de technologies pour mon application
    Par Franco dans le forum Java EE
    Réponses: 5
    Dernier message: 21/10/2003, 14h10

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