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 :

Gérer dynamiquement les "persistence-unit"


Sujet :

JPA Java

  1. #1
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut Gérer dynamiquement les "persistence-unit"
    Bonjour !

    J'essaie comme le titre l'indique de gérer dynamiquement différentes connexions à plusieurs bases de données en passant d'un persistence-unit à un autre...

    C'est en relation avec un précédent sujet : Même App web pour différents clients/bases de données

    Donc chaque base correspond à un client, et donc aux données le concernant pour la même application que j'ai développée...

    Dans 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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" 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_2_0.xsd">
      <persistence-unit name="Client1PU" transaction-type="JTA">
        <jta-data-source>jdbc/jclient1</jta-data-source>
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties/>
      </persistence-unit>
      <persistence-unit name="Client2PU" transaction-type="JTA">
        <jta-data-source>jdbc/jclient2</jta-data-source>
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties/>
      </persistence-unit>
    </persistence>
    En fait, j'ai une page de login (login.jsf) dans laquelle je choisis le Client que je suis, et donc la base de données à laquelle je vais me connecter :
    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
     
    <h:form>
        <h:panelGrid columns="2" style="margin-top: 20px;" columnClasses="labelCol, inputCol" cellpadding="5">
            <h:outputText value="Site :" />
            <h:selectOneMenu value="#{utilisateurSession.persistenceUnit}">
                <f:selectItem itemValue="Client1PU" itemLabel="Je suis le Client 1" />
                <f:selectItem itemValue="Client2PU" itemLabel="Je suis le Client 2" />
            </h:selectOneMenu>
            <h:outputText value="Identifiant :" />
            <h:inputText value="#{utilisateurSession.login}" maxlength="20" size="20" />
            <h:outputText value="Mot de passe :" />
            <h:inputSecret value="#{utilisateurSession.password}" maxlength="20" size="20" />
            <h:commandButton value="Se connecter" action="#{utilisateurSession.doConnect}" />
        </h:panelGrid>
    </h:form>
    et le managed-bean qui recupère les infos :
    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
     
    @ManagedBean
    @SessionScoped
    public class UtilisateurSession implements Serializable {
        @EJB
        private UtilisateurFacadeLocal ejb;
        private Utilisateur utilisateur = null;
        private String persistenceUnit;
        private String login;
        private String password;
     
        public String doConnect() {
            String navigateTo = null;
            try {
                utilisateur = ejb.authenticate(login, password);
                navigateTo = "home";
            } catch (Exception e) {
                addMessage(e);
            }
            return navigateTo;
        }
     
    }
    Ainsi dans mes beans de session, j'essaie un "truc" comme cela :
    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
    @Stateless
    public class UtilisateurFacade extends AbstractFacade<Utilisateur> implements UtilisateurFacadeLocal {
    
        private EntityManager em;
    
        @Override
        protected EntityManager getEntityManager() {
            return em;
        }
    
        public UtilisateurFacade() {
            super(Utilisateur.class);
            UtilisateurSession account = (UtilisateurSession) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("utilisateurSession");
            em = Persistence.createEntityManagerFactory(account.getPersistenceUnit()).createEntityManager();
        }
    
        @Override
        public Utilisateur authenticate(String login, String password) {
    
            Query query = em.createNamedQuery("Utilisateur.findByIdentifiant");
            query.setParameter("identifiant", login);
    
            Utilisateur utilisateur;
            try {
                utilisateur = (Utilisateur) query.getSingleResult();
            } catch (Exception e) {
                throw new ValidationException("Identifiant inconnu !");
            }
    
            // on vérifie le mot de passe si l'utilisateur existe
            if (utilisateur != null) {
                utilisateur.matchPassword(password);
            }
    
            return utilisateur;
        }
    }
    afin de créer "dynamiquement" ma connexion à la base...
    Mais au final... ça plante !


    Donc comment pourais-je procéder ? Y-a-t-il une meilleure méthode ?

    Je vous remercie de vos propositions


  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    bonjour,

    qu'entendez-vous par "ça plante" ??... il doit bien y avoir une stacktrace qui peut nous renseigner un peu plus sur ce "plantage"

  3. #3
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    Oui désolé... si je n'ai rien décrit, c'est que je sens bien que c'est pas du tout "académique" d'appeler un managed-bean session scope dans un bean de session stateless .

    En fait, dès que je déploie sur Glassfish j'ai cette erreur :
    GRAVE: PWC2768: IOException while loading persisted sessions: java.io.InvalidClassException: controller.UtilisateurSession; local class incompatible: stream classdesc serialVersionUID = 9183840310866678431, local class serialVersionUID = 3053119823564742594
    java.io.InvalidClassException: controller.UtilisateurSession; local class incompatible: stream classdesc serialVersionUID = 9183840310866678431, local class serialVersionUID = 3053119823564742594

    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.readRemainingObject(StandardSession.java:1818)
    at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1750)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.deserialize(StandardSession.java:1063)
    at org.apache.catalina.session.StandardManager.readSessions(StandardManager.java:511)
    at org.apache.catalina.session.StandardManager.doLoadFromFile(StandardManager.java:441)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:411)
    at org.apache.catalina.session.StandardManager.start(StandardManager.java:854)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5270)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:499)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:928)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1947)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1619)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:90)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:126)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:362)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:185)
    at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:174)
    at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:87)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:84)
    at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:77)
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
    at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:236)
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:128)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:457)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:401)
    at org.jvnet.hk2.osgiadapter.HK2Main.start(HK2Main.java:125)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:915)
    at org.jvnet.hk2.osgimain.Main.start(Main.java:140)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1077)
    at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
    at java.lang.Thread.run(Thread.java:619)

    GRAVE: PWC2773: Exception loading sessions from persistent storage
    java.io.InvalidClassException: controller.UtilisateurSession; local class incompatible: stream classdesc serialVersionUID = 9183840310866678431, local class serialVersionUID = 3053119823564742594

    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.readRemainingObject(StandardSession.java:1818)
    at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1750)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.deserialize(StandardSession.java:1063)
    at org.apache.catalina.session.StandardManager.readSessions(StandardManager.java:511)
    at org.apache.catalina.session.StandardManager.doLoadFromFile(StandardManager.java:441)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:411)
    at org.apache.catalina.session.StandardManager.start(StandardManager.java:854)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5270)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:499)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:928)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1947)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1619)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:90)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:126)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:362)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:185)
    at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:174)
    at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:87)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:84)
    at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:77)
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
    at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:236)
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:128)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:457)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:401)
    at org.jvnet.hk2.osgiadapter.HK2Main.start(HK2Main.java:125)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:915)
    at org.jvnet.hk2.osgimain.Main.start(Main.java:140)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1077)
    at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
    at java.lang.Thread.run(Thread.java:619)
    et ça :
    ATTENTION: Exception while starting bundle com.sun.enterprise.osgi-adapter [61]
    org.osgi.framework.BundleException: Activator start error in bundle com.sun.enterprise.osgi-adapter [61].

    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1751)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:915)
    at org.jvnet.hk2.osgimain.Main.start(Main.java:140)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1077)
    at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.NullPointerException
    at org.glassfish.admin.monitor.jvm.JVMStatsProviderBootstrap.postConstruct(JVMStatsProviderBootstrap.java:87)
    at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:174)
    at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:87)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:84)
    at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:77)
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
    at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:313)
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:128)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:457)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:401)
    at org.jvnet.hk2.osgiadapter.HK2Main.start(HK2Main.java:125)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    ... 9 more


    Ainsi, en faisant abstraction de ces exceptions, j'essaie quand même de me connecter par ma page login.xhtml, et logiquement ça plante :
    ATTENTION: A system exception occurred during an invocation on EJB UtilisateurFacade method public entity.Utilisateur stateless.UtilisateurFacade.authenticate(java.lang.String,java.lang.String)
    javax.ejb.EJBException

    at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5119)
    at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5017)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4805)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
    at $Proxy129.authenticate(Unknown Source)
    at controller.UtilisateurSession.doConnect(UtilisateurSession.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
    Exception Description: Error compiling the query [SELECT u FROM Utilisateur u WHERE u.identifiant = :identifiant]. Unknown entity type [Utilisateur].

    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1328)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1348)
    at stateless.UtilisateurFacade.authenticate(UtilisateurFacade.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1056)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1128)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5292)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5264)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5252)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)
    ... 48 more
    Caused by: Exception [EclipseLink-8034] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException
    Exception Description: Error compiling the query [SELECT u FROM Utilisateur u WHERE u.identifiant = :identifiant]. Unknown entity type [Utilisateur].

    at org.eclipse.persistence.exceptions.JPQLException.entityTypeNotFound(JPQLException.java:483)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTreeContext.classForSchemaName(ParseTreeContext.java:138)
    at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getClassOfFirstVariable(SelectNode.java:327)
    at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getReferenceClass(SelectNode.java:316)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.getReferenceClass(ParseTree.java:439)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.adjustReferenceClassForQuery(ParseTree.java:79)
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateReadQueryInternal(JPQLParseTree.java:103)
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateQuery(JPQLParseTree.java:84)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:202)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:173)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:125)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:109)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1326)
    ... 72 more

    Voilà...


    Après mon problème principal, pour l'application que j'ai développée, c'est de pouvoir gérer mes différents clients (et donc mes bases de données).

    J'aimerais déployer une fois mon application sur le serveur Glassfish avec monapp.war et, comme j'ai tenté très maladroitement de choisir la base de données lorsque le client se connecte à l'identification...



    Merci pour les conseils que l'on pourrait me donner.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    A première vue, je dirais que le problème vient d'une incompatibilité de serialVersionUID

    le serialVersionUID a une importance dans la sérialisation, vérifiez que vous avez bien générer vous-même les UID.
    Telle que le décrit la stacktrace, vous avez un objet local avec 2 UID différents, donc interprété comme 2 objets différents avec le même nom. -> Deployment fails, donc pas la peine d'essayer de se connecter, les entities ne sont pas "managées" d'où le "plantage".

    Ce serait mon 1er axe de recherche.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 70
    Points : 83
    Points
    83
    Par défaut
    Je trouve que c'est une très mauvaise pratique ce que vous êtes entrain d'essayer de faire.
    Mettre des données membres dans une session facade sans état (et en plus utiliser le constructeur pour cela). En plus vous cherchez à faire de la ré entrance entre la facade et le client (anti-pattern).
    J’essaye même pas de savoir d’où vient l’exception.
    Ce que je propose pour votre problème. Deux cas de figures :
    1 - Le nombre de client « types de clients » est fixe soit 2 (client 1 et client 2). C’est simple je ne ferais pas de création dynamique de PU. J’opterais pour une session facade (stateless) par type de client directement (soientt Client1Facade et Client2Facade) et le PersistenceManager sera injecté. Au niveau du client une business delegator qui en fonction de la valeur retournée par (UtilisateurSession) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("utilisateurSession"); redirigera l’appel du client vers Client1facade ou Client2Facade.

    2- le nombre de clients « types de clients » n’est pas connu d’avance
    Dans ce cas je mettrais une seule facade statefull et un serviceLocator qui s’occupe de l’instanciation des facades. Les paramètres d’instanciation sont passés au statefull à travers une méthode init qu’appellera le service locator (On pourrait imaginer aussi utitiliser une méthode annotée @Init). C’est cette dernière méthode qui s’occupera de récupérer le EntityManager en fonction du nom du PU que lui a passé l’appelant.

  6. #6
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Citation Envoyé par salber Voir le message
    1 - Le nombre de client « types de clients » est fixe soit 2 (client 1 et client 2). C’est simple je ne ferais pas de création dynamique de PU. J’opterais pour une session facade (stateless) par type de client directement (soientt Client1Facade et Client2Facade) et le PersistenceManager sera injecté. Au niveau du client une business delegator qui en fonction de la valeur retournée par (UtilisateurSession) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("utilisateurSession"); redirigera l’appel du client vers Client1facade ou Client2Facade.
    Non.
    Un truc important : Don't repeat yourself.

    Citation Envoyé par salber Voir le message
    2- le nombre de clients « types de clients » n’est pas connu d’avance
    Dans ce cas je mettrais une seule facade statefull et un serviceLocator qui s’occupe de l’instanciation des facades. Les paramètres d’instanciation sont passés au statefull à travers une méthode init qu’appellera le service locator (On pourrait imaginer aussi utitiliser une méthode annotée @Init). C’est cette dernière méthode qui s’occupera de récupérer le EntityManager en fonction du nom du PU que lui a passé l’appelant.
    Je sais pas si je suis le seul mais je comprends rien à ce que tu propose (un coup ya une seule facade, un autre coup yen a plusieurs oO). Je suis pas vraiment d'accord avec le statefull ...

    Pour en venir au problème tu peux très bien utiliser tes URL pour loader le bon persistance-unit à base d'init-param dans ton web.xml qui associe des key à des persistance unit.

    Ensuite tu init ton EntityManager programmatiquement en fonction de la key qui est passé dans ton url

  7. #7
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    tout d'abord merci pour vos réponses car je ne sais vraiment pas comment procéder...



    Citation Envoyé par michok34 Voir le message
    A première vue, je dirais que le problème vient d'une incompatibilité de serialVersionUID

    le serialVersionUID a une importance dans la sérialisation, vérifiez que vous avez bien générer vous-même les UID.

    Ce serait mon 1er axe de recherche.
    Pour le serialVersionUID, elles sont définies dans mes entités à la valeur 1L (netbeans me le met automatiquement).




    Citation Envoyé par salber Voir le message
    Je trouve que c'est une très mauvaise pratique ce que vous êtes entrain d'essayer de faire.
    Mettre des données membres dans une session facade sans état (et en plus utiliser le constructeur pour cela). En plus vous cherchez à faire de la ré entrance entre la facade et le client (anti-pattern).
    J’essaye même pas de savoir d’où vient l’exception.
    J'avoue... j'ai un peu fait exprès en jouant la provocation car je ne sais pas même pas comment aborder le problème...
    D'ailleurs dans mon 1er post je ne parle pas de mes exceptions car ce que j'avais écris me semblait totalement à côté de la plaque...




    Citation Envoyé par salber Voir le message
    1 - Le nombre de client « types de clients » est fixe soit 2 (client 1 et client 2). C’est simple je ne ferais pas de création dynamique de PU. J’opterais pour une session facade (stateless) par type de client directement (soientt Client1Facade et Client2Facade) et le PersistenceManager sera injecté. Au niveau du client une business delegator qui en fonction de la valeur retournée par (UtilisateurSession) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("utilisateurSession"); redirigera l’appel du client vers Client1facade ou Client2Facade.
    Je connaitrais le nombre de clients... une petite vingtaine...
    Donc votre solution (si j'ai bien compris) serait de recréer toutes les facades (j'en ai une bonne vingtaine également) pour chaque client et de rediriger ?




    Citation Envoyé par Alain Defrance Voir le message
    Pour en venir au problème tu peux très bien utiliser tes URL pour loader le bon persistance-unit à base d'init-param dans ton web.xml qui associe des key à des persistance unit.

    Ensuite tu init ton EntityManager programmatiquement en fonction de la key qui est passé dans ton url
    Alors là c'est ce que j'ai pensé faire... mais comment ?
    Si tu pouvais me donner un exemple avec le web.xml et comment ensuite on charge l'EntityManager ? Car c'est ce que je cherche à faire... mais je ne sais pas du tout comment réaliser l'affaire...

  8. #8
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Qu'est-ce qu'il te bloque ?

  9. #9
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par Alain Defrance Voir le message
    Qu'est-ce qu'il te bloque ?
    Et bien tout... je ne sais pas comment faire :
    1. que mettre dans le web.xml
    2. comment initialiser la connexion en récupérant l'info de la clé



    Bon, prenons l'exemple de mon fichier de 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
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" 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_2_0.xsd">
      <persistence-unit name="Client1PU" transaction-type="JTA">
        <jta-data-source>jdbc/jclient1</jta-data-source>
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties/>
      </persistence-unit>
      <persistence-unit name="Client2PU" transaction-type="JTA">
        <jta-data-source>jdbc/jclient2</jta-data-source>
        <shared-cache-mode>NONE</shared-cache-mode>
        <properties/>
      </persistence-unit>
    </persistence>


    Citation Envoyé par Alain Defrance Voir le message
    Pour en venir au problème tu peux très bien utiliser tes URL pour loader le bon persistance-unit à base d'init-param dans ton web.xml qui associe des key à des persistance unit.
    Si je comprends bien... je crée une Servlet par client ?
    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
     
        <servlet>
            <servlet-name>Client1Servlet</servlet-name>
            <servlet-class>com.monapp.Client1Servlet</servlet-class>
            <init-param>
                <param-name>PU</param-name>
                <param-value>Client1PU</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>Client1Servlet</servlet-name>
            <url-pattern>/Client1</url-pattern>
        </servlet-mapping>
     
        <servlet>
            <servlet-name>Client2Servlet</servlet-name>
            <servlet-class>com.monapp.Client2Servlet</servlet-class>
            <init-param>
                <param-name>PU</param-name>
                <param-value>Client2PU</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>Client2Servlet</servlet-name>
            <url-pattern>/Client2</url-pattern>
        </servlet-mapping>
    Ca voudrait dire que je pourrais accéder pour chaque client par une URL spécifique (ce que je voudrais) tel que :


    Mais je mets quoi dans la servlet ? Faut rediriger vers la page de login ?
    Surtout si dans mon application je passe par facelet où la page de login est :
    http://monapp/faces/pages/login.xhtml


    Si tu pouvais mettre quelques lignes de code pour me montrer car là c'est toujours le flou... je suis même loin d'être sûr que ce que je viens d'écrire était en fait ce que tu pensais !

    Merci de tes éclaircissements

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 70
    Points : 83
    Points
    83
    Par défaut
    Voila ce que je te propose de faire:
    1 - la façade simplifiée
    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
     
      @PersistenceContexts({@PersistenceContext(name="persistence/Client1PU", type=PersistenceContextType.TRANSACTION),
    					  @PersistenceContext(name="persistence/Client2PU", type=PersistenceContextType.TRANSACTION),
    					  @PersistenceContext(name="persistence/Client3PU", type=PersistenceContextType.TRANSACTION)})					  
     
    @Stateless
    public class UtilisateurFacade implements UtilisateurFacadeRemote, UtilisateurFacadeLocal {
    	@Resource SessionContext context;
        /**
         * Default constructor. 
         */
        public UtilisateurFacade() {
     
        }
     
    	@Override
    	public Utilisateur authenticate(String login, String password, ClientEnum type) throws ValidationException {
    			Utilisateur utilisateur = getUserByLogin(login,type);
    	        // on vérifie le mot de passe si l'utilisateur existe
    	        if (utilisateur != null) {
    	            utilisateur.matchPassword(password);
    	        }
     
    	        return utilisateur;
    	}
    	protected Utilisateur getUserByLogin(String login, ClientEnum type) throws ValidationException{
    	       Query query = this.getClientEntityManager(type).createNamedQuery("Utilisateur.findByIdentifiant");
    	        query.setParameter("identifiant", login);
     
    	        Utilisateur utilisateur;
    	        try {
    	            utilisateur = (Utilisateur) query.getSingleResult();
    	        } catch (Exception e) {
    	            throw new ValidationException("Identifiant inconnu !");
    	        }
    	       return utilisateur;
    	}
    	protected EntityManager getClientEntityManager(ClientEnum type){
    		return (EntityManager)context.lookup("persistence/"+type.getPersistenceName());
    	}
     
    }

    L'enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       public enum ClientEnum {
    	CLENT1("Client1PU"),CLIENT2("Client1PU"),CLIENT3("Client1PU");
    	private String persistenceName;
    	 private ClientEnum(String persistenceName){
    		this.persistenceName = persistenceName;
    	}
    	public String getPersistenceName(){
    		return this.persistenceName;
    	}
    }
    Et enfin le client se présentera comme ceci

    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
     
     
    @ManagedBean
    @SessionScoped
    public class UtilisateurSession implements Serializable {
        @EJB
        private UtilisateurFacadeLocal ejb;
        private Utilisateur utilisateur = null;
        private String persistenceUnit;
        private String login;
        private String password;
     
        public String doConnect() {
            String navigateTo = null;
            try {
    			String unitName = utilisateurSession.getPersistenceUnit();
    			ClientEnum client = ClientEnum.valueOf(unitName);
                utilisateur = ejb.authenticate(login, password, client);
                navigateTo = "home";
            } catch (Exception e) {
                addMessage(e);
            }
            return navigateTo;
        }
     
    }
    Après libre à toi de remplacer l’Enum de PU par des entrées d’environnement (init-param) ou pas

  11. #11
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par salber Voir le message
    Voila ce que je te propose de faire
    Je te remercie pour ta proposition que je vais tester

    Sinon, ça veut dire que je dois faire passer à chaque fois le type de client en paramètre pour pouvoir "requêter" dans mes façades.

    Et il n'y a aucun moyen de connaître tous les PersistenceContext sans devoir les déclarer en en-tête de mes stateless vu que le fichier persistence.xml existe ?

    Et encore merci !

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 70
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par kimausoleil Voir le message
    Sinon, ça veut dire que je dois faire passer à chaque fois le type de client en paramètre pour pouvoir "requêter" dans mes façades.
    Qu’est ce qui te gène dans le faite passer le type de client (de persistance) à passer à la façade ?


    Citation Envoyé par kimausoleil Voir le message
    Et il n'y a aucun moyen de connaître tous les PersistenceContext sans devoir les déclarer en en-tête de mes stateless vu que le fichier persistence.xml existe ?
    Dans ton fichier persistence.xml je vois la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <persistence-unit name="Client1PU" transaction-type="JTA">
    Ce qui veux dire que tu veux utiliser JTA (Est-ce bien cela ?).

    Pour faire du CMT il faut que les PersistentContext soient créer par le conteneur donc (si je ne me trompe pas) il faut forcement les déclarer quelque part ou faire de l’injection de dépendance. Tu peux les déclarer dans ta façade (comme je l’ai fait) ou dans le fichier de déploiement ejb-jar.xml .

  13. #13
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    Ca marche nickel !


    Encore merci !

  14. #14
    Membre habitué Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Points : 135
    Points
    135
    Par défaut
    Et pour finir, j'ai fait ma Servlet pour identifier le client qui redirige vers ma page de login :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
     
            HttpSession session = request.getSession();
            if (session!=null) session.invalidate();
     
            session = request.getSession(true);
            session.setAttribute("url", request.getServletPath());
     
            response.sendRedirect(request.getContextPath() + "/faces/pages/login.xhtml");
        }
    Dans mon managed-bean :
    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
     
    @ManagedBean
    @SessionScoped
    public class UtilisateurSession implements Serializable {
     
        @EJB
        private UtilisateurFacadeLocal ejb;
        private Utilisateur utilisateur = null;
     
        private String login;
        private String password;
        private ClientEnum client;
     
    //========================
    //=     CONSTRUCTEUR
    //========================
        public UtilisateurSession() {
            String url= null;
            if (!(url= getParamSession("url")).equals("")) {
                for (ClientEnum c : ClientEnum.values()) {
                    if (c.getUrl().equals(url)) {
                        this.client = c;
                        break;
                    }
                }
            }
        }
     
    ...
     
    }
    Donc j'ai mon ClientEnum :
    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
     
    public enum ClientEnum{
        CLIENT1("Je suis le client 1", "/Client1", "Client1PU"),
        CLIENT2("Je suis le client 2", "/Client2", "Client2PU");
        private String persistenceUnit;
        private String site;
        private String url;
        private ClientEnum(String site, String url, String persistenceUnit) {
            this.site = site;
            this.url= url;
            this.persistenceUnit = persistenceUnit;
        }
        public String getPersistenceUnit() {
            return this.persistenceUnit;
        }
        public String getSite() {
            return site;
        }
        public String getUrl() {
            return url;
        }
    }
    Et maintenant je peux me connecter en passant par une URL pour chaque client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        <servlet>
            <servlet-name>ClientServlet</servlet-name>
            <servlet-class>servlet.ClientServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ClientServlet</servlet-name>
            <url-pattern>/Client1</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>ClientServlet</servlet-name>
            <url-pattern>/Client2</url-pattern>
        </servlet-mapping>
    tel que :
    http://mon-application/Client1
    http://mon-application/Client2
    etc...


    Et tout se passe bien !

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

Discussions similaires

  1. Persistence Unit dynamique
    Par thecaptain dans le forum JPA
    Réponses: 4
    Dernier message: 09/06/2011, 11h24
  2. Gérer dynamiquement les Splitters et les Vues.
    Par elecstr dans le forum MFC
    Réponses: 3
    Dernier message: 21/05/2007, 21h37
  3. nettoyer les persistence units
    Par toomsounet dans le forum NetBeans
    Réponses: 1
    Dernier message: 11/03/2007, 15h10

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