2013-04-03 23 views
6

Ho più servizi web (diciamo 2, A e B) e ho bisogno di generare un client per usarli insieme. In Netbeans uso la procedura guidata "nuovo client servizio Web" che passa i due wsdl, guardando l'output Netbeans chiama semplicemente wsimport per ognuno di essi.wsimport: più sovrascrittura wsdl ObjectFactory

wsimport http:/mydomain/wsA.svc?wsdl 
wsimport http:/mydomain/wsB.svc?wsdl 

Sia A e B, generare un com.myDomain.myApp lo stesso pacchetto (immagino che sono definiti nello stesso namespace), in modo da ottenere il set di classe stub di A e B fusi nello stesso pacchetto .

Tuttavia, wsimport crea anche un ObjectFactory per ogni webservice quindi se si genera lo stub di B dopo A ottengo solo l'ObjectFactory relativo alle definizioni B (poiché il primo, A, viene sovrascritto). Al contrario, ObjectFactory di A sopravvive se cambio l'ordine.

Il problema è che ho bisogno di entrambe le ObjectFactories al fine di creare le istanze Clas JAXBElements di confezionamento per i tipi di entrambi webservices A e B.

Esiste un modo per mappare lo spazio dei nomi per A in un pacchetto Java e la B in un'altra per ottenere

com.mydomain.myapp.a 
com.mydomain.myapp.b 

e quindi mantenere entrambi i ObjectFactory?

Il semplice refactoring non aiuta perché internamente viene chiamato getClass(), quindi, una volta che un pacchetto è stato refactored, non funziona più.

risposta

1

Probabilmente si può farlo tramite file vincolanti JAXB - dare un'occhiata a questa domanda/risposta: java wsimport rename/different ObjectFactory.java

Da quella risposta, date un'occhiata alla roba file di collegamento a Oracle: http://docs.oracle.com/javaee/5/tutorial/doc/bnbbf.html

+0

Ok! Ho usato questo legame XML: \t \t \t \t \t \t Tuttavia, mi dà errore XPath: null. Non ho xsd, hai suggerimenti? – alexroat

+1

Ho appena pensato: hai provato "wsimport -p com.mydomain.myapp.a http: /mydomain/wsA.svc? Wsdl" e poi "wsimport -p com.mydomain.myapp.b http:/mydomain/wsB .svc? wsdl "? Ciò inserirà tutto il codice generato nel pacchetto specificato (come per l'opzione "-p"), senza la necessità di un file di bind. (Avrei dovuto pensarci prima ...) – FOOM

+0

Sì, l'ho fatto. Ci sono molti errori come la classe "Due dichiarazioni causano una collisione nella classe ObjectFactory". e "Una classe/interfaccia con lo stesso nome" com.anthesi.prova.ExecuteTransmDocModelResponse "è già in uso. Utilizzare una personalizzazione della classe per risolvere questo conflitto." – alexroat

0

Questo ha funzionato per me (utilizzando Spring Java config)

@Bean 
public Jaxb2Marshaller marshaller() { 
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); 
    marshaller.setPackagesToScan("com.example.api"); 
    return marshaller; 
} 

utilizzando setPackagesToScan invece di setContextPath ha fatto il lavoro per me (presumo ignora che cosa è in ObjectFactory e scansione s l'intero pacchetto).