【问题标题】:How do I resolve this "Could not initialize class org.apache.cxf.common.injection.ResourceInjector" error when autowiring a jaxws:client?自动装配 jaxws:client 时,如何解决此“无法初始化类 org.apache.cxf.common.injection.ResourceInjector”错误?
【发布时间】:2015-02-20 23:38:27
【问题描述】:

我正在使用 JBoss 7.1.3.Final、Spring 3.2.11.RELEASE、CXF 2.7.15 和 Maven 3.0.3。我正在尝试自动装配通过以下 JAX-WS 插件代码生成的 Web 服务客户端……

<plugin>
    <groupId>org.jvnet.jax-ws-commons</groupId> 
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <target>2.1</target>
                <wsdlDirectory>${basedir}/src/wsdl</wsdlDirectory>
                <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
                <packageName>org.mainco.bsorg</packageName>
            </configuration>
        </execution>
    </executions>
</plugin>

我尝试使用此应用程序上下文代码自动连接我的客户端……

<jaxws:client id="orgWebServiceClient"
              serviceClass="org.mainco.bsorg.OrganizationWebService" 
              address="${wsdl.url}" /> 

这在我的服务类中......

@Service("orgWsdlSvc")
public class OrgWsdlServiceImpl implements OrgWsdlService 
{

    …     
    @Resource(name="orgWebServiceClient")
    private OrganizationWebService m_ows;

但是,当我去部署我的 WAR 文件时,我收到了这个令人费解的错误。它甚至没有告诉我是什么类导致了 NoClassDefFoundError ...

16:06:55,597 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-16) Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orgWebServiceClient': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.apache.cxf.common.injection.ResourceInjector
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:618) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:934) [spring-context-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) [spring-context-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410) [spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) [spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) [spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.17.Final.jar:]
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.17.Final.jar:]
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:89) [jboss-as-web-7.1.3.Final.jar:7.1.3.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) [classes.jar:1.6.0_65]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) [classes.jar:1.6.0_65]
    at java.lang.Thread.run(Thread.java:695) [classes.jar:1.6.0_65]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.cxf.common.injection.ResourceInjector
    at org.apache.cxf.bus.extension.ExtensionManagerImpl.loadAndRegister(ExtensionManagerImpl.java:243) [cxf-rt-core-2.7.15.jar:2.7.15]
    at org.apache.cxf.bus.extension.ExtensionManagerImpl.activateAllByType(ExtensionManagerImpl.java:144) [cxf-rt-core-2.7.15.jar:2.7.15]
    at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:126) [cxf-rt-core-2.7.15.jar:2.7.15]
    at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:138) [cxf-rt-core-2.7.15.jar:2.7.15]
    at org.apache.cxf.bus.spring.SpringBus.<init>(SpringBus.java:46) [cxf-rt-core-2.7.15.jar:2.7.15]
    at org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor.getBusForName(BusWiringBeanFactoryPostProcessor.java:72) [cxf-rt-core-2.7.15.jar:2.7.15]
    at org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor.addDefaultBus(BusWiringBeanFactoryPostProcessor.java:188) [cxf-rt-core-2.7.15.jar:2.7.15]
    at org.apache.cxf.jaxws.spring.JaxWsProxyFactoryBeanDefinitionParser$JAXWSSpringClientProxyFactoryBean.setApplicationContext(JaxWsProxyFactoryBeanDefinitionParser.java:74) [cxf-rt-frontend-jaxws-2.7.15.jar:2.7.15]
    at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:117) [spring-context-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:92) [spring-context-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:396) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1507) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521) [spring-beans-3.2.11.RELEASE.jar:3.2.11.RELEASE]
    ... 19 more

我还需要做什么才能在我的 Spring @Service 类中使用我的 Web 服务客户端?

编辑根据评论,这是我的 WEB-INF/jboss-deployment-structure.xml 文件...

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <dependencies>
            <module name="org.joda.time" />
            <module name="org.apache.velocity" />
            <module name="org.bouncycastle" slot="main" export="true" />
            <system>
                <paths>
                    <path name="com/sun/net/ssl/internal/ssl" />
                </paths>
            </system>
        </dependencies>
        <exclude-subsystems>
            <subsystem name="jpa" />
            <subsystem name="jaxr" />
            <subsystem name="jaxrs" />
            <subsystem name="webservices" />
            <subsystem name="weld" /> <!-- Prevent WELD-000070 failure -->
        </exclude-subsystems>
        <exclusions>
            <module name="javaee.api" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

为了进一步回答 cmets,这里是请求的输出:

LOG.info(ResourceInjector.class.getClassLoader());
ModuleClassLoader for Module "deployment.myproject.war:main" from Service Module Loader

LOG.info(ResourceInjector.class.getProtectionDomain().getCodeSource().getLocation());
vfs:/content/myproject.war/WEB-INF/lib/cxf-api-2.7.15.jar

LOG.info(ExtensionManagerImpl.class.getClassLoader());
ModuleClassLoader for Module "deployment.myproject.war:main" from Service Module 

LOG.info(ExtensionManagerImpl.class.getProtectionDomain().getCodeSource().getLocation());
vfs:/content/myproject.war/WEB-INF/lib/cxf-rt-core-2.7.15.jar

【问题讨论】:

  • 你能把一个完整的示例应用程序放在 github 或其他地方吗?我认为这更多与类加载相关,而不是与弹簧相关。
  • 不幸的是,这是专有代码,我的公司不希望我发布它。我可以发布我的 mvn 依赖项:树——这有帮助吗?
  • 好吧,创建一个具有相同问题的示例。如果您尝试通过 class.forname() 获取缺少的类,您的应用程序中是否可用? cxf-api.jar 在类路径上吗?您是否运行了junit-test?单元测试有效吗?你在使用 jboss 模块吗?你的deployment-structure.xml 是什么?你把 spring 放到 jboss-module 中了吗?
  • 我在 jboss 上也遇到过这类问题,但发生这种情况的原因可能有很多......。一个运行的例子会更容易。
  • 嗨,我将 jboss-deployment-strcture.xml 添加到我的问题中。不,我没有向 jboss 添加 spring 模块(此时不能选择更改我们的 Jboss 配置)。 JUnit 测试通过(自动装配发生),是的,我有这个文件—— /WEB-INF/lib/cxf-api-2.7.15.jar 。但是,请注意“NoClassDefFoundError”旁边没有列出任何类。例外是“无法初始化类 org.apache.cxf.common.injection.ResourceInjector”。

标签: spring cxf jax-ws autowired jaxws-maven-plugin


【解决方案1】:

给定

NoClassDefFoundError: 无法初始化类 org.apache.cxf.common.injection.ResourceInjector

我猜ResourceInjector 中的静态初始化存在问题,原因是类加载问题。

当您查看source code of ResourceInjector 时,您会注意到它有一个使用javax.annotation.Resource 的静态初始化程序。

我不熟悉 jboss 类加载,甚至不熟悉 jboss,但我看起来你排除了 javaee.api 依赖项。这是否意味着加载ResourceInjector 类的类加载器无法加载javax.annotation.Resource 类?

更新

我之前在 mule 应用程序服务器中遇到过一些NoClassDefFoundErrors,它总是与应用程序服务器的类加载有关。为了找出问题,我会在“ExtensionManagerImpland inspect/querythis.getClass().getClassLoader()andThread.currentThread().getContextClassLoader()”的第 243 行打开一个调试器。这在过去帮助我解决了这些问题。

【讨论】:

  • 是的,我排除了 javaee.api,但是您提到的 javax.annotation.Resource 类包含在 $JBOSS_HOME/modules//javax/annotation/api/main/jboss-annotations-api_1.1_spec 中-1.0.1.Final.jar 文件,我不排除。鉴于此,您建议我如何解决此问题?
  • 尝试将 添加到您的 jboss-deployment-structure.xml,或您的 module.xml 包含 jboss-annotations.jar 的任何名称。
  • 如果 Resource 类在运行时实际上可用,那么我不知道问题可能是什么。唯一发生的其他静态初始化是日志记录,但我认为这不是问题。
  • Martin,您关于编辑 jboss-deployment-structure 的建议奏效了!如果你想整理一个答案,我可以接受或者我可以接受这个。
  • 我认为 Pieter 因看到静态初始化程序而获得了赏金。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多