2017-01-11 3 views
2

Mon test Arquillian ressemble à ceci:Bean pas injecté avec le test CDI et Arquillian a échoué lorsque SolrServer est utilisé

import static org.junit.Assert.assertNotNull; 
    import static org.junit.Assert.assertTrue;  
    import javax.enterprise.inject.spi.CDI; 
    import javax.inject.Inject;  
    import org.jboss.arquillian.junit.Arquillian; 
    import org.junit.Test; 
    import org.junit.runner.RunWith; 
    import org.wildfly.swarm.arquillian.DefaultDeployment; 

    @RunWith(Arquillian.class) 
    @DefaultDeployment(type = Type.WAR) 
    public class CDIArquillianTest { 

     @Inject 
     private SomeClass someclass; 

     @Test 
     public void testInjection() { 
      assertNotNull(someclass); 
      assertTrue(someclass.printI().contains("my string")); 
     } 

     @Test 
     public void testCDIContainerPresence() throws Exception { 
      assertNotNull(CDI.current()); 
     } 
    } 

classe Injecté:

import javax.enterprise.context.ApplicationScoped; 
    import org.apache.solr.client.solrj.SolrServer; 

    @ApplicationScoped 
    public class SomeClass{ 
     private SolrServer solrServer; 

     public SomeClass(){  
     } 

     public String printI(){ 
      String somestr = "my string"; 
      return somestr; 
     }  
    } 

A l'intérieur de celui-ci, il y a SolrServer classe, qui fait le problème. Sans l'inclussion de la classe, tout fonctionne bien. Le message d'erreur indique que ma classe SomeClass a été ignorée, car la classe SolrServer n'a pas été trouvée. Comment puis-je gérer cette erreur? Dois-je inclure cette classe SolrServer manuellement? Vous ne pouvez pas utiliser @DefaultDeployment ici? Peut-être que SolrServer est en quelque sorte incompatible avec CDI?

Message d'erreur:

2017-01-11 15:59:17,956 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC000001: Failed to start service jboss.deployment.unit."CDIArquillianTest.jar".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."CDIArquillianTest.jar".WeldStartService: Failed to start service 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type SomeClass with qualifiers @Default 
    at injection point [BackedAnnotatedField] @Inject private xx.CDIArquillianTest.someclass 
    at xx.CDIArquillianTest.someclass(CDIArquillianTest.java:0) 
WELD-001474: Class xx.SomeClass is on the classpath, but was ignored because a class it references was not found: org.apache.solr.client.solrj.SolrServer from [Module "deployment.CDIArquillianTest.jar:main" from Service Module Loader]. 

Un peu plus stacktrace:

2017-01-11 15:59:16,825 INFO [org.jboss.weld.Bootstrap] (Weld Thread Pool -- 2) WELD-000119: Not generating any bean definitions from xxSomeClass because of underlying class loading error: Type org.apache.solr.client.solrj.SolrServer from [Module "deployment.CDIArquillianTest.jar:main" from Service Module Loader] not found. If this is unexpected, enable DEBUG logging to see the full error. 
2017-01-11 15:59:16,825 DEBUG [org.jboss.weld.Bootstrap] (Weld Thread Pool -- 2) Catching: org.jboss.weld.resources.spi.ResourceLoadingException: Error while loading class xx.SomeClass 
    at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransformer.java:186) 
    at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransformer.java:194) 
    at org.jboss.weld.bootstrap.FastAnnotatedTypeLoader.loadAnnotatedType(FastAnnotatedTypeLoader.java:113) 
    at org.jboss.weld.bootstrap.FastAnnotatedTypeLoader.createContext(FastAnnotatedTypeLoader.java:102) 
    at org.jboss.weld.bootstrap.FastAnnotatedTypeLoader.loadAnnotatedType(FastAnnotatedTypeLoader.java:91) 
    at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:98) 
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$1.doWork(ConcurrentBeanDeployer.java:65) 
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$1.doWork(ConcurrentBeanDeployer.java:62) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:63) 
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:56) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at org.jboss.threads.JBossThread.run(JBossThread.java:320) 
Caused by: java.lang.NoClassDefFoundError: Lorg/apache/solr/client/solrj/SolrServer; 
    at java.lang.Class.getDeclaredFields0(Native Method) 
    at java.lang.Class.privateGetDeclaredFields(Class.java:2583) 
    at java.lang.Class.getDeclaredFields(Class.java:1916) 
    at org.jboss.weld.annotated.slim.backed.SecurityActions.getDeclaredFields(SecurityActions.java:49) 
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedFields.computeValue(BackedAnnotatedType.java:179) 
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedFields.computeValue(BackedAnnotatedType.java:173) 
    at org.jboss.weld.util.LazyValueHolder.get(LazyValueHolder.java:35) 
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$EagerlyInitializedLazyValueHolder.<init>(BackedAnnotatedType.java:156) 
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedFields.<init>(BackedAnnotatedType.java:173) 
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType$BackedAnnotatedFields.<init>(BackedAnnotatedType.java:173) 
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.<init>(BackedAnnotatedType.java:62) 
    at org.jboss.weld.annotated.slim.backed.BackedAnnotatedType.of(BackedAnnotatedType.java:44) 
    at org.jboss.weld.resources.ClassTransformer$TransformClassToBackedAnnotatedType.load(ClassTransformer.java:83) 
    at org.jboss.weld.resources.ClassTransformer$TransformClassToBackedAnnotatedType.load(ClassTransformer.java:80) 
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527) 
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2319) 
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2282) 
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197) 
    at com.google.common.cache.LocalCache.get(LocalCache.java:3937) 
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941) 
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824) 
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:49) 
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCastCacheValue(LoadingCacheUtils.java:74) 
    at org.jboss.weld.resources.ClassTransformer.getBackedAnnotatedType(ClassTransformer.java:175) 
    ... 14 more 
Caused by: java.lang.ClassNotFoundException: org.apache.solr.client.solrj.SolrServer from [Module "deployment.CDIArquillianTest.jar:main" from Service Module Loader] 
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351) 
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93) 
    ... 38 more 

fichier pom.xml:

<packaging>war</packaging> 

<properties> 
    <version.wildfly.swarm>2017.1.1</version.wildfly.swarm> 
    <version.wildfly.arquillian>1.1.10.Final</version.wildfly.arquillian> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    <failOnMissingWebXml>false</failOnMissingWebXml> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <solr.version>4.10.3-cdh5.9.0</solr.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.wildfly.swarm</groupId> 
      <artifactId>bom-all</artifactId> 
      <version>${version.wildfly.swarm}</version> 
      <scope>import</scope> 
      <type>pom</type> 
     </dependency> 
     <dependency> 
      <groupId>org.jboss.arquillian</groupId> 
      <artifactId>arquillian-bom</artifactId> 
      <version>${version.wildfly.arquillian}</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 
<dependencies> 
    <!-- Java EE 7 dependency --> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>7.0</version> 
     <scope>provided</scope> 
    </dependency> 


    <!-- Wildfly Swarm Fractions --> 
    <dependency> 
     <groupId>org.wildfly.swarm</groupId> 
     <artifactId>logging</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.wildfly.swarm</groupId> 
     <artifactId>jaxrs-validator</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.wildfly.swarm</groupId> 
     <artifactId>cdi</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-core</artifactId> 
     <version>2.6.0-mr1-cdh5.7.4</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-common</artifactId> 
     <version>2.6.0-cdh5.7.4</version> 
     <scope>provided</scope> 
    </dependency> 
    <!-- Solar --> 
    <dependency> 
     <groupId>org.apache.solr</groupId> 
     <artifactId>solr-solrj</artifactId> 
     <version>${solr.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.solr</groupId> 
     <artifactId>solr-core</artifactId> 
     <version>${solr.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.solr</groupId> 
     <artifactId>solr-cell</artifactId> 
     <version>${solr.version}</version> 
    </dependency> 


    <!-- Other Dependencies --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.2</version> 
     <scope>provided</scope> 
    </dependency> 

    <!-- Test Dependencies --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.wildfly.swarm</groupId> 
     <artifactId>arquillian</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.arquillian.junit</groupId> 
     <artifactId>arquillian-junit-container</artifactId> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.skyscreamer</groupId> 
     <artifactId>jsonassert</artifactId> 
     <version>1.4.0</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

Après réponse de Ken I ajouté @DefaultDeployment (type = Type. WAR) au test d'arquilian, et maintenant le déploiement de ce test fonctionne bien, mais le test a échoué avec le message ci-dessous (sans SolrSer ver fonctionne tout le bien du temps):

java.lang.RuntimeException: Could not inject members 
      at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:135) 
      at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.enrich(CDIInjectionEnricher.java:78) 
      at org.jboss.arquillian.test.impl.TestInstanceEnricher.enrich(TestInstanceEnricher.java:52) 
     ... 
      at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) 
      at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) 
      at java.lang.Thread.run(Thread.java:745) 
     Caused by: org.jboss.arquillian.test.spi.ArquillianProxyException: org.jboss.weld.exceptions.IllegalArgumentException : WELD-001408: Unsatisfied dependencies for type SomeClass with qualifiers @Default 
      at injection point [BackedAnnotatedField] @Inject private xx.CDIArquillianTest.someclass 
      at xx.CDIArquillianTest.someclass(CDIArquillianTest.java:0) 
     [Proxied because : Original exception caused: class java.lang.ClassNotFoundException: org.jboss.weld.exceptions.IllegalArgumentException] 
      at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:81) 
      at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:69) 
      at org.jboss.weld.manager.BeanManagerImpl.createInjectionTarget(BeanManagerImpl.java:1110) 
      at org.jboss.weld.util.ForwardingBeanManager.createInjectionTarget(ForwardingBeanManager.java:201) 
      at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectNonContextualInstance(CDIInjectionEnricher.java:143) 
      at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:125) 
      ... 115 more 
     Caused by: org.jboss.arquillian.test.spi.ArquillianProxyException: org.jboss.weld.exceptions.DeploymentException : WELD-001408: Unsatisfied dependencies for type SomeClass with qualifiers @Default 
      at injection point [BackedAnnotatedField] @Inject private xx.CDIArquillianTest.someclass 
      at xx.CDIArquillianTest.someclass(CDIArquillianTest.java:0) 
     [Proxied because : Original exception caused: class java.lang.ClassNotFoundException: org.jboss.weld.exceptions.DeploymentException] 
      at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:359) 
      at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:281) 
      at org.jboss.weld.bootstrap.Validator.validateProducer(Validator.java:417) 
      at org.jboss.weld.injection.producer.InjectionTargetService.validateProducer(InjectionTargetService.java:36) 
      at org.jboss.weld.manager.InjectionTargetFactoryImpl.validate(InjectionTargetFactoryImpl.java:135) 
      at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:79) 
      ... 120 more 

Répondre

2

La question semble être que le déploiement en cours de création est un JAR et non pas une guerre, ce qui explique pourquoi les bibliothèques Solr ne sont pas présents.

Vous devez utiliser:

@DefaultDeployment(type = WAR) 

au lieu de simplement

@DefaultDeployment 
+0

Merci pour la réponse. J'ai fait comme vous avez suggéré: @DefaultDeployment (type = Type.WAR), et maintenant le déploiement du test Aquirian fonctionne correctement, mais quand même, le test JUnit échoue. J'ai ajouté un message de trace au poste ci-dessus – Miroslaw

+0

Projet Github pour reproduire le problème: https://github.com/mielniczekm/cdi-simpleTest/tree/master – Miroslaw