No bean named 'cxf' is defined

2020-07-06 07:00发布

问题:

I am trying to setup a simple restful web application, using tomcat 6.0.32, cxf 2.4.1. Anytime I issue any call, I get back an exception "No bean named 'cxf' is defined", where cxf is my bus.

Looking at the application log, I can see the cxf instance is created, and cached.

================ APP LOG BEGIN======================

910 DEBUG - Creating shared instance of singleton bean 'cxf'

910 DEBUG - Creating instance of bean 'cxf'

1018 DEBUG - Eagerly caching bean 'cxf' to allow for resolving potential circular references

1031 DEBUG - Returning eagerly cached instance of singleton bean 'cxf' that is not fully initialized yet - a consequence of a circular reference

1034 DEBUG - Finished creating instance of bean 'cxf'

1035 DEBUG - Returning cached instance of singleton bean 'org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor'

1035 DEBUG - Returning cached instance of singleton bean 'org.apache.cxf.bus.spring.Jsr250BeanPostProcessor'

1035 DEBUG - Returning cached instance of singleton bean 'org.apache.cxf.bus.spring.BusExtensionPostProcessor'

1035 DEBUG - Creating shared instance of singleton bean 'connection'

1035 DEBUG - Creating instance of bean 'connection'

1035 DEBUG - Eagerly caching bean 'connection' to allow for resolving potential circular references

1052 DEBUG - Finished creating instance of bean 'connection'

1052 DEBUG - Creating shared instance of singleton bean 'connectionService'

1052 DEBUG - Creating instance of bean 'connectionService'

1053 DEBUG - Eagerly caching bean 'connectionService' to allow for resolving potential circular references

1053 DEBUG - Returning cached instance of singleton bean 'connection'

1053 DEBUG - Returning cached instance of singleton bean 'cxf'

1121 DEBUG - Invoking init method 'create' on bean with name 'connectionService'

1356 DEBUG - Finished creating instance of bean 'connectionService'

1384 DEBUG fecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@45d1c3cd]

1385 DEBUG - Returning cached instance of singleton bean 'lifecycleProcessor'

1387 DEBUG - Returning cached instance of singleton bean 'cxf'

1387 DEBUG - Returning cached instance of singleton bean 'cxf'

1388 DEBUG - Invoking init method 'create' on bean with name 'connectionService'

1391 DEBUG - Finished creating instance of bean 'connectionService'

1391 DEBUG - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@2c3299f6]

1391 DEBUG - Returning cached instance of singleton bean 'lifecycleProcessor'

1391 DEBUG - Published root WebApplicationContext as ServletContext attribute with name [org.springframework.web.context.WebApplicationContext.ROOT]

1391 INFO - Root WebApplicationContext: initialization completed in 1390 ms

================ APP LOG END======================

But when a request comes in, it always fails saying it can't find the bean.

===================== Tomcat (localhost) Log Begin ==================

INFO: Initializing Spring root WebApplicationContext

Jul 14, 2011 8:57:03 AM org.apache.catalina.core.ApplicationContext log

SEVERE: StandardWrapper.Throwable

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cxf' is defined

at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:527)

at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1083)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:274)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)

at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1079)

at org.apache.cxf.transport.servlet.CXFServlet.loadBus(CXFServlet.java:58)

at org.apache.cxf.transport.servlet.CXFNonSpringServlet.init(CXFNonSpringServlet.java:54)

at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)

at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)

at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:864)

at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)

at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1665)

at java.lang.Thread.run(Thread.java:662)

===================== Tomcat (localhost) Log End ==================

The only thing I can think of is that the bean is inserted in one context, and is being retrieved from another, but can't validate this or find a way around it. Any help would be greatly appreciated.

回答1:

From your error log, I assume you use Spring, if so, you will need to add following lines to your Spring Context XML:

<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-xml.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

Hope this helps.



回答2:

If someone needs the Spring Java Based Configuration for solving this problem, there are two options:

You can import the cxf.xml file into your Java Config class with:

@ImportResource({ "classpath:META-INF/cxf/cxf.xml" })

Or you can define the bean programatically in your Java Configuration class with:

@Bean
public SpringBus cxf() {        
    return new SpringBus();
}

CXF + Spring Java Configuration class example.



回答3:

In case anybody else gets here and is using mulesoft esb. The problem is also present in this system. To fix the issue, add the following section before the definition of the flows.

<spring:beans>
    <spring:import resource="classpath:META-INF/cxf/cxf.xml" />
    <spring:import resource="classpath:META-INF/cxf/cxf-extension-xml.xml" />
    <spring:import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <spring:bean class="org.apache.cxf.bus.spring.Jsr250BeanPostProcessor" /> 
    <spring:bean id="classname" name="classname" class="some.implemented.interface.path" />
</spring:beans>


回答4:

Add these dependencies in the pom file:

<dependency>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-rt-rs-extension-search</artifactId>
   <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-rs-extension-providers</artifactId>
    <version>3.0.1</version>
</dependency>


回答5:

Please check these steps in below:

1) lines mentioned in below should be included in your Spring Context XML:

<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

2) Web.xml should be configured as below:

<context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath*:cxf.xml</param-value>
</context-param>

3) Dependencies in below should be added inside your pom.xml:

<dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-security</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-policy</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-service-description</artifactId>
        <version>${cxf.version}</version>
    </dependency>

If all this didnt help you to solve your issue, the last step is to check your weblogic configuration, here are the steps you have to check on your weblogic server:

  1. make sure you have define a machine to your server.
  2. you need to specify your server and machine for your deployment as below:

Weblogic app deployment

I hope by checking all these steps your issue get solved.

Cheers