2017-08-07 5 views
1

Je suis en train d'installer un environnement de programmation avec Jetty, OpenEJB et WebApps pour le développement et exécuter des tests Selenium. Quelque chose de très similaire décrit dans cet article: http://tomee.apache.org/functional-testing-with-openejb,-jetty-and-selenium.html.Problèmes avec CDI dans la configuration pour les tests fonctionnels avec TomEE (ou OpenEJB), Jetty et Selenium

Cette configuration est très bonne, car je peux démarrer le test sélénium par l'IDE ou Maven, et utiliser le même code pour démarrer un serveur pour le développement.

J'ai vu cette installation fonctionner en utilisant une ancienne version de Jetty (6.2) et avec un conteneur EJB inconnu (appelé MyContainer) dans EJB 3.0. Maintenant je fais (ou j'essaye de faire ...) la même chose dans un nouveau projet, qui fonctionnera dans Wildfly 10.1.0 et fera des recherches EJB par CDI (BeanManager).

Mais j'ai quelques problèmes pour mettre CDI pour fonctionner correctement dans les nouvelles versions de Jetty et OpenEJB ou TomEE. Je ne peux pas trouver d'autres exemples sur Internet pour la même chose avec des versions plus récentes des cadres. Je ne sais même pas si j'ai vraiment besoin de Jetty pour le faire.

Première tentative: la jetée (sans jetée-jndi) + OpenEJB + tomee.jpa.cdi = false

Utilisation du OpenEJB 4.7.4 et 9.4 jetée, quand je lance le code CDI.current().getBeanManager() résultats dans:

java.lang.IllegalStateException: Unable to access CDI 

persistence.xml:

<property name="tomee.jpa.cdi" value="false" /> 

Obs .: le fichier beans.xml est dans le répertoire WEB-INF de mon webapp dans toutes les tentatives.

Deuxième tentative: la jetée (sans jetée-jndi) + tomee + tomee.jpa.cdi = false

En utilisant tomee 7.0.3 et 9.4 jetée, je suis en mesure d'avoir CDI changeant seulement OpenEJB pour tomee en maven dependency (bizarre, on suppose qu'OpenEJB supporte le CDI). Ce CDI fonctionne quand je suis mise au point au milieu de la configuration du serveur, mais lorsque le programme a frappé la webapp, se produit une erreur whem J'essaie de fait une recherche EJB:

"On a thread without an initialized context nor a classloader mapping a deployed app" 

Troisième tentative: Jetty (avec jetty-jndi) + TomEE ou OpenEJB + tomee.jpa.cdi = false

EJB Le conteneur démarre mais le serveur Jetty ne peut pas démarrer car il n'a pas été trouvé java:comp/env/.

javax.naming.NameNotFoundException: Name "comp/env" not found 

code ajouté:

Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server); 
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", 
        "org.eclipse.jetty.plus.webapp.EnvConfiguration", 
        "org.eclipse.jetty.plus.webapp.PlusConfiguration"); 

Quatrième tentative: la jetée (sans jetée-jndi) + tomee + tomee.jpa.factory.lazy = true

Modifier la propriété en persistence.xml :

<property name="tomee.jpa.factory.lazy" value="true" /> 

Le conteneur EJB démarré et CDI.current() existe, mais lorsque je tente d'exécuter quelques SQLs après que l'esprit h le code:

@PersistenceContext(unitName="my-pu") 
private EntityManager em; 

//method 
Session session = em.unwrap(Session.class); 
session.doWork(new Work() { 
    @Override 
    public void execute(Connection connection) throws SQLException { 
     try (Statement statement = connection.createStatement()) { 
      statement.executeUpdate(sql); 
      connection.commit(); 
     } 
    } 
}); 

Le système arrête beaucoup de temps à Session session = em.unwrap(Session.class);.Après cela, beaucoup d'erreurs apparaissent (Unable to build Hibernate SessionFactory, Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister) et à la fin de la stacktrace:

Caused by: javax.ejb.ConcurrentAccessTimeoutException: No instances available in Stateless Session Bean pool. Waited 30 SECONDS 

Question

Alors, peut-être un problème de classpath? J'ai déjà eu quelques problèmes avec TomEE CDI qui a été résolu après avoir supprimé certaines dépendances de l'ancien conteneur EJB. J'ai déjà lu sur les problèmes CDI que la cause était mauvaises importations liées à cdi-api dépendance.

Si quelqu'un a une idée très différente (et plus simple) que la mienne de faire fonctionner ce type d'environnement, c'est également bienvenu.

Certaines parties pertinentes du code

Maven dépendance API JavaEE:

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>7.0</version> 
    <scope>provided</scope> 
</dependency> 

Maven dépendance API CDI:

<dependency> 
    <groupId>javax.enterprise</groupId> 
    <artifactId>cdi-api</artifactId> 
    <version>1.2</version> 
    <scope>provided</scope> 
</dependency> 

dépendance Maven OpenEJB 4.7.4:

<dependency> 
     <groupId>org.apache.openejb</groupId> 
     <artifactId>openejb-core</artifactId> 
     <version>4.7.4</version> 
</dependency> 

dépendance Maven Tomee 7.0.3:

<dependency> 
    <groupId>org.apache.tomee</groupId> 
    <artifactId>openejb-core</artifactId> 
    <version>7.0.3</version> 
</dependency> 

dépendance Maven Jetty:

<dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-server</artifactId> 
     <version>9.4.6.v20170531</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-webapp</artifactId> 
     <version>9.4.6.v20170531</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-plus</artifactId> 
     <version>9.4.6.v20170531</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-jndi</artifactId> 
     <version>9.4.6.v20170531</version> 
    </dependency> 

persistence.xml

<!-- I uncomment only one of this properties each time --> 
<!-- <property name="tomee.jpa.factory.lazy" value="true" />--> 
<property name="tomee.jpa.cdi" value="false" /> 

ServiceLocator code de recherche (ServiceLocator.lookup(CrudService.class)):

@Override 
public Object lookup(Class<?> type, Annotation... annotations) throws NamingException { 
    BeanManager manager = CDI.current().getBeanManager(); 
    Iterator<Bean<?>> beans = manager.getBeans(type, annotations).iterator(); 

    if (!beans.hasNext()) { 
     throw new NamingException("CDI BeanManager cannot find an instance of requested type " + type.getName()); 
    } 
    Bean<?> bean = beans.next(); 
    CreationalContext<?> ctx = manager.createCreationalContext(bean); 
    return manager.getReference(bean, type, ctx); 
} 

Créer EJBContainer:

EJBContainer.createEJBContainer(props).getContext(); //nothing special in the props 

Répondre

0

Peut-être utiliser org.apache.tomee JavaEE api seulement et pas des pots de spécification javax premier.

Ensuite, vous pouvez avoir besoin d'une classe forçant la propriété système jndi - malheureusement à l'exécution - à définir le paquet openejb en premier puisque le programme d'installation de jetty jndi rompt l'installation existante en supposant qu'elle est seule.

Également peut-être partager vos journaux ou projet, il peut aider à savoir ce qui se passe.