2010-01-14 23 views
6

Estoy teniendo the following problem (informado por alguien más) al ejecutar mi aplicación empresarial bajo Glassfish. Debajo de Jetty funciona bien.Cómo elegir CXF en Metro en Glassfish

javax/xml/ws/spi/Provider menciona la creación de un recurso META-INF/services/javax.xml.ws.spi.Provider, pero esto ya se proporciona con CXF y la creación de un archivo de recursos adicional no resuelve este problema bajo Glassfish.

¿Alguien sabe cómo asegurarse de que CXF se recoja en GlassFish?
(Estoy usando un proyecto Maven Multi-modules con dependencia CXF 2.2.5)

¡Gracias!
Tim


editar # 1

Saltarse el problema por el momento y sólo trabajando con Metro, pero realmente me gustaría saber cómo utilizar CXF lugar si alguien tiene alguna punteros .. Si nada funciona voy a tener que cambiar contenedor de aplicaciones web (o mirar en metro para llenar mis necesidades)


editar # 2

Algunas de las soluciones detallan la solución para la guerra al agregar <class-loader delegate="false"/> al archivo sun-web.xml. Sin embargo, esto no funciona para las aplicaciones de ee que no son de guerra.

+0

Estoy encontrando el mismo problema sólo con un EJB empaquetado en una oreja. Abrí una recompensa porque realmente me gustaría escuchar algunas buenas respuestas a esto sin tener que duplicar la pregunta, de ahí mis ediciones. – javamonkey79

+0

+1: Esta es una mala característica de Glassfish que actualmente estoy enfrentando con 'jsf': Glassfish ha creado bibliotecas jsf y éstas generan conflictos sobre un código que tiene jsf. ¡Realmente molesto y la solución vale la recompensa que está abierta! ¡También quiero saber la solución! – mico

+0

También [esta publicación] (http: //www.shareyourwork.org/roller/ralphsjavablog/entry/axiom_jar_conflict_in_glassfish) dice cómo funcionan las cosas solo en algunas versiones de Glassfish y en otras no. – mico

Respuesta

1

Los frascos de Metro (Glassfish's JAX-WS implementation) probablemente se estén incluyendo con Glassfish, ¿puede excluirlos del classpath? Como está utilizando maven, debe analizar las dependencias glassfish y utilizar una exclusión para los tarros de metro.


Parece que es necesario tener los frascos CXF en la ruta de clases aplicaciones antes de los frascos de Metro. Probablemente no pueda modificar el classloader/classpath del sistema, pero puede cambiar el Thread.currentThread().getContextClassLoader() de manera que primero cargue CXF. También podrían unas rutas de clases en Glassfish se puede modificar

Mira la fuente de javax.xml.ws.spi.FactoryFinder#find() para ver cómo el proveedor se carga realmente

+0

Este podría ser el caso, pero no estoy seguro de cómo remediar esto .. Es una guerra compilada que estoy cargando a GlassFish, ¿entonces Maven excluirá que todavía tenga algún efecto después de la compilación? (Es decir, ¿estas exclusiones se transmitirán a la guerra y se usarán en el servidor?) – Tim

+0

¿De modo que se está implementando el proveedor de Metro cuando se implementa la aplicación en Glassfish, no durante el desarrollo? – Kevin

+0

El desarrollo se realiza con Jetty ... No hay dependencia GlassFish para excluir ... – Tim

5

Añadir un sol-web.xml y establece delegado = false a la clase -Equipos:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD 
Application Server 9.0 Servlet 2.5//EN' 
'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'> 
<sun-web-app> 
    <class-loader delegate="false"/> 
</sun-web-app> 
+0

Agregar este archivo al directorio web-inf de war funcionó para mí. ¡Gracias! – sdoca

0

La solución que se me ocurrió (y estoy insatisfecho con) es utilizar JaxWsProxyFactoryBean. Hay un ejemplo [aquí]. 1.

Este es el jist de lo que tiene que hacer:

public static void main(String args[]) throws Exception { 

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 

    // I didn't need these next 2 calls, but I doubt they hurt 
    factory.getInInterceptors().add(new LoggingInInterceptor()); 
    factory.getOutInterceptors().add(new LoggingOutInterceptor()); 

    factory.setServiceClass(AuthService.class); 
    factory.setAddress("http://localhost:7001/authManager/services/cxfAuth"); 

    // 'AuthService' is whatever your interface type is 
    AuthService client = (AuthService) factory.create(); 

    Employee employee = client.getEmployee("0223938"); 
    System.out.println("Server said: " + employee.getLastName() + ", " + employee.getFirstName()); 
    System.exit(0); 

} 
+0

¿Podría copiar las partes relevantes de la solución? Los enlaces externos tienden a romperse con el tiempo ... – Tim

+1

Oh seguro. Buena llamada. – javamonkey79

Cuestiones relacionadas