Apache CXF – ClassNotFoundException: org.springframework.context.ApplicationListener

septiembre 10, 2012

Para configurar Apache CXF en mis proyectos, me bastaba con agregar la siguiente dependencia en el archivo pom.xml

<dependency>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-rt-frontend-jaxrs</artifactId>
 <version>2.6.2</version>
</dependency>

agregar la configuración en el archivo web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 version="2.5">

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>WEB-INF/beans.xml</param-value>
 </context-param>

<listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

<servlet>
 <servlet-name>CXFServlet</servlet-name>
 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>

<servlet-mapping>
 <servlet-name>CXFServlet</servlet-name>
 <url-pattern>/api/*</url-pattern>
 </servlet-mapping>
</web-app>

y configurar los servicios en el archivo beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd">

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

<jaxrs:server id="arp-rest" address="/rest/arp">
 <jaxrs:serviceBeans>
 <ref bean="arp-rest-empleados" />
 </jaxrs:serviceBeans>
 </jaxrs:server>

<bean id="arp-rest-empleados" class="mx.com.apestudio.gwt.server.api.rest.EmpleadosResource" />
</beans>

Pero la ultima vez que quise hacer esto, me arrojaba las siguientes excepciones:

[WARN] Could not instantiate listener org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationListener
El problema es que para las versiones 2.6.x las dependencias de spring fueron marcadas como opcionales. Y estas son utilizadas por el Servlet CXFServlet. Para corregir el problema basta con agregar la dependencia a spring-web en nuestro archivo pom.xml

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-web</artifactId>
 <version>3.1.1.RELEASE</version>
</dependency>

Si no quieres o no puedes utilizar spring, tendrías que utilizar el servlet CXFNonSpringServlet y configurar los servicios programáticamente.

public class MyServiceServlet extends CXFNonSpringServlet {

private static final long serialVersionUID = 1L;

@Override
 // Called at startup time to register this web service.
 public void loadBus(ServletConfig servletConfig) {
 super.loadBus(servletConfig);

Bus bus = getBus();
 BusFactory.setDefaultBus(bus);

createFactoryBean();
 }

private void createFactoryBean() {
 JaxWsServerFactoryBean fb = new JaxWsServerFactoryBean();
 fb.setWsdlLocation("myservice.wsdl");
 fb.setAddress("/");
 fb.setServiceBean(new MyServicePortImpl());
 fb.setServiceClass(MyServicePort.class);
 fb.setServiceName(new QName("http://www.example.com/MyService", "MyService"));
 fb.create();
 }
}

Fuentes:
http://cxf.apache.org/docs/26-migration-guide.html
http://cxf.apache.org/docs/jaxrs-services-configuration.html
http://cxf.apache.org/docs/jax-rs.html#JAX-RS-Projectsetupandconfiguration
http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
http://www.mkyong.com/spring/spring-error-classnotfoundexception-org-springframework-web-context-contextloaderlistener/
http://www.axlrosen.net/stuff/cxf-without-spring.html

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: