2010-01-14 21 views
6

Sto avendo the following problem (segnalato da qualcun altro) durante l'esecuzione della mia applicazione aziendale in Glassfish. Sotto il molo funziona bene.Come scegliere CXF su Metro su Glassfish

javax/xml/ws/spi/Provider menziona la creazione di una risorsa META-INF/services/javax.xml.ws.spi.Provider, ma questa viene già fornita con CXF e la creazione di un file di risorse aggiuntivo non risolve questo problema in Glassfish.

Qualcuno sa come assicurarsi che CXF venga prelevato da GlassFish?
(Sto usando un progetto Maven Multi-moduli con dipendenza CXF 2.2.5)

Grazie!
Tim


EDIT # 1

Saltare il problema per ora e solo lavorando con la Metro, ma mi piacerebbe davvero sapere come utilizzare CXF invece se qualcuno ha qualche puntatori .. Se non funziona nulla avrei potuto cambiare contenitore di applicazioni web (o guardare in metropolitana a riempire le mie esigenze)


EDIT # 2

Alcune delle soluzioni illustrano la correzione per war aggiungendo <class-loader delegate="false"/> al file sun-web.xml. Tuttavia, questo non funziona per le app ee non belliche.

+0

Sto trovando lo stesso problema solo con un ejb confezionato in un orecchio. Ho aperto una taglia perché mi piacerebbe davvero ricevere alcune buone risposte senza dover duplicare la domanda, quindi le mie modifiche. – javamonkey79

+0

+1: Questa è una brutta caratteristica di Glassfish che sto attualmente affrontando con 'jsf': Glassfish ha costruito nelle librerie jsf e questo genera conflitti su un codice che contiene jsf. Davvero fastidioso e la soluzione vale la taglia che è aperta! Voglio assolutamente conoscere anche la soluzione! – mico

+0

Anche [questo post] (http: //www.shareyourwork.org/roller/ralphsjavablog/entry/axiom_jar_conflict_in_glassfish) dice come funzionano solo alcune versioni di Glassfish e altre no. – mico

risposta

1

I barattoli della metropolitana (implementazione di Glassfish's JAX-WS) sono probabilmente inclusi in Glassfish, è possibile escluderli dal classpath? Dal momento che stai usando Maven, dovresti analizzare le dipendenze del glassfish e usare un'esclusione per i barattoli della metropolitana.


Sembra che è necessario avere i vasi CXF sul classpath applicazioni prima i vasetti della metropolitana. Probabilmente non è possibile modificare il classloader/classpath del sistema ma è possibile modificare lo Thread.currentThread().getContextClassLoader() in modo che carichi CXF prima. C'è anche un impostazioni potrebbero classpath nel Glassfish è possibile modificare

Partenza la fonte per javax.xml.ws.spi.FactoryFinder#find() per vedere come il provider è effettivamente caricata

+0

Questo potrebbe essere il caso, ma non sono sicuro su come rimediare a questo. È un file compilato che sto caricando su GlassFish, quindi Maven esclude che abbia ancora qualche effetto dopo la compilazione? (Cioè: questi saranno esclusi dalla guerra e usati sul server?) – Tim

+0

Quindi, quando raccoglierà il provider di Metro quando si applica un'applicazione a Glassfish, non durante lo sviluppo? – Kevin

+0

Lo sviluppo è fatto con Jetty .. Non c'è alcuna dipendenza da GlassFish da escludere .. – Tim

5

Aggiungere un sole-web.xml e impostare delegato = false alla classe -loader:

<?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

L'aggiunta di questo file alla directory web-inf di war ha funzionato per me. Grazie! – sdoca

0

La soluzione mi è venuta (e sono soddisfatto con) è quello di utilizzare JaxWsProxyFactoryBean. C'è un esempio [qui]. 1.

Questa è la jist di quello che hai da fare:

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

È possibile copiare le parti rilevanti della soluzione? I collegamenti esterni tendono a rompersi nel tempo .. – Tim

+1

Oh sicuro. Buona chiamata – javamonkey79

Problemi correlati