Java 当使用SolrServer时,未注入CDI和Arquillian测试的Bean失败
我的Arquillian测试如下所示:Java 当使用SolrServer时,未注入CDI和Arquillian测试的Bean失败,java,solr,cdi,jboss-arquillian,wildfly-swarm,Java,Solr,Cdi,Jboss Arquillian,Wildfly Swarm,我的Arquillian测试如下所示: 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.Arquilli
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());
}
}
注入类:
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;
}
}
在它内部,有一个SolrServer类,它解决了这个问题。没有班级的包容,一切都很好。错误消息表明我的SomeClass被忽略,因为找不到SolrServer类。
我如何处理这个错误?我应该手动包含这个SolrServer类吗?无法在此处使用@DefaultDeployment?也许SolrServer与CDI不兼容
错误消息:
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].
更多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
问题似乎在于所创建的部署是一个JAR而不是WAR,这就是为什么不存在solr库的原因 您需要使用:
@DefaultDeployment(type = WAR)
而不仅仅是
@DefaultDeployment
谢谢你的回复。我按照您的建议做了:@DefaultDeployment(type=type.WAR),现在Aquirian测试的部署工作正常,但JUnit测试仍然失败。我将跟踪消息添加到post UpperGitHub项目中,以重现该问题:
@DefaultDeployment(type = WAR)
@DefaultDeployment