【问题标题】:Instantiating a cxf service causes injection failure for other unrelated service实例化 cxf 服务会导致其他不相关服务的注入失败
【发布时间】:2017-11-15 22:03:19
【问题描述】:

我正在为一些 Web 服务开发消费者服务。 应用程序已经在提供 Web 服务(作为服务器),但这是第一个消费者。

生成是好的,但是当我尝试从消费者服务的构造函数实例化 javax.xml.ws.Service 时,我遇到了一个奇怪的问题:所有provider webservices implementationor bean 突然变得“未定义”(如果我从 cxf.xml 注释第一个提供者,第二个也是“未定义”)。

看起来我触发了一些可能发生得太快的意外注入......但我不明白为什么,以及如何解决它!欢迎任何想法!

错误跟踪:

org.springframework.beans.factory.BeanCreationException:创建在类路径资源 [spring-core-context.xml] 中定义的名称为“someService”的 bean 时出错:bean 的实例化失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 bean 类 [com.my.services.impl.com.my.services.impl.SomeServiceImpl]:构造函数抛出异常;嵌套异常是java.lang.RuntimeException:org.springframework.beans.factory.BeanCreationException:创建名为“someProviderWebService”的bean时出错:在设置构造函数参数时无法解析对bean“someProviderWebServiceImplementor”的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'someProviderWebServiceImplementor' is defined 在 org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:254)

...

原因:org.springframework.beans.BeanInstantiationException:无法实例化bean类[com.my.services.impl.com.my.services.impl.SomeServiceImpl:构造函数抛出异常;嵌套异常是java.lang.RuntimeException:org.springframework.beans.factory.BeanCreationException:创建名为“someProviderWebService”的bean时出错:在设置构造函数参数时无法解析对bean“someProviderWebServiceImplementor”的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'someProviderWebServiceImplementor' is defined 在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115)

...

原因:java.lang.RuntimeException:org.springframework.beans.factory.BeanCreationException:创建名为“someProviderWebService”的bean时出错:在设置构造函数参数时无法解析对bean“someProviderWebServiceImplementor”的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'someProviderWebServiceImplementor' is defined 在 org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:97)

...

原因:org.springframework.beans.factory.BeanCreationException:创建名为“someProviderWebService”的bean时出错:在设置构造函数参数时无法解析对bean“someProviderWebServiceImplementor”的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'someProviderWebServiceImplementor' is defined 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275) ... 引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为“someProviderWebServiceImplementor”的bean 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)

...

(最后一个)

cxf.xml

  <jaxws:endpoint 
      id="someProviderWebService" 
      implementor="#someProviderWebServiceImplementor" 
      address="/services/SomeProviderWebService"/>
  <jaxws:endpoint 
      id="someProviderWebService2" 
      implementor="#someProviderWebServiceImplementor2" 
      address="/services/SomeProviderWebService2"/>

    <bean id="logInbound" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
    <bean id="logOutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />

    <cxf:bus>
        <cxf:inInterceptors><ref bean="logInbound" /></cxf:inInterceptors>
        <cxf:outInterceptors><ref bean="logOutbound" /></cxf:outInterceptors>
        <cxf:inFaultInterceptors><ref bean="logInbound" /></cxf:inFaultInterceptors>
        <cxf:outFaultInterceptors><ref bean="logOutbound" /></cxf:outFaultInterceptors>
    </cxf:bus> 

someServiceImpl:

    public SomeServiceImpl() throws MalformedURLException {
        SomeConsumerService service= new SomeConsumerService (); // this is the line causing the problem
    }

网络服务 SomeConsumerService :

public class SomeConsumerService extends javax.xml.ws.Service{

    public final static URL WSDL_LOCATION;
    public final static QName SERVICE = new QName("urn:test.com:anywhere/webservice/T", "SomeService");
    static {
        URL url = null;
        try {
            url = new URL("http://some.wsdl");
        } catch (MalformedURLException e) {
            System.err.println("Ooops! ");
        }
        WSDL_LOCATION = url;
    }

    public SomeConsumerService () {
        super(WSDL_LOCATION, SERVICE);
    }
}

背景:

<bean name="someService" class="com.my.services.impl.SomeServiceImpl">
</bean>

<bean name="someProviderWebServiceImplementor"  class="com.my.services.impl.SomeProviderWebServiceImplementorImpl">
</bean>

【问题讨论】:

    标签: java spring soap cxf


    【解决方案1】:

    一位同事设法找出了问题:看起来 cxf servlet 将基于 cxf.xml 创建自己的上下文(仅!)当它存在时。如果不是,它将在应用程序上下文中查找其配置。

    不过,它也只有在我创建消费者时才是真的……因此,我不确定这更多的是意外的副作用,还是真正的功能。

    无论如何,这里的解决方案是:

    1. cxf.xml 重命名为 another_name_for_cxf.xml
    2. 从 application-context.xml(或你给它的任何名称)导入重命名的文件

      <import resource="classpath:another_name_for_cxf.xml"/>
      

    然后,魔法就会开始运作!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2014-05-07
      • 1970-01-01
      相关资源
      最近更新 更多