2012-03-02 10 views
6

Ho un modulo in cui ho i miei schemi XSD, dove uno schema può fare riferimento a un altro percorso relativo utilizzo all'interno di posizione dello schema:Publishing statico WSDL e dei relativi schemi XSD utilizzando Spring WS

<xs:import namespace="http://my.namespace.org" schemaLocation="../mypackage/my.xsd"/> 

Qui sono anche usando xjc per generare bean Jaxb da questi schemi xsd.

Ora ho un modulo in cui è il mio servizio web è implemetented, utilizzando spring-ws (2.0.4). E voglio usare il statico WSDL e pubblicarlo con gli schemi xsd, dove le posizioni dello schema verranno trasformate in URL come "http://myerver.url.com/my.xsd".

La domanda è come ottenere elegantemente questo?

(In alternativa combinare i XSD in uno schema e che a WSDL)

(In teoria potrei trasformare questi XSD utilizzando uno script e aggiungerli alle risorse (XSD e WSDL) per un (dispatcher primavera) servlet ma non mi sembra molto comodo)

+0

breve commento ... non sarà in grado di combinare le XSD in un unico dal momento che stai usando una dichiarazione < xs: import />; puoi avere solo uno spazio dei nomi di destinazione per file XSD. Tuttavia, è possibile incorporare tutti gli XSD, a prescindere dagli spazi dei nomi, nella sezione wsdl: types, nel qual caso tutte le importazioni devono eliminare gli attributi schemaLocation. Più tardi ... –

+0

Ciao, quello che non voglio fare è questo inlineing manuale. Quindi questa soluzione è se potesse essere fatto senza troppi problemi, come usare un lib generale che lo fa a me. – csviri

+0

Finalmente risolto da una propria implementazione di servlet. – csviri

risposta

9

Il servizio web di primavera ha un modo per farlo in modo elegante in realtà. Tutto quello che devi fare è quello di definire un fagiolo SimpleXsdSchema con l'id destra (che verrà utilizzato come nome XSD senza .xsd) nel file XML di definizione di fagioli, qualcosa di simile al di sotto

<bean id="my" 
     class="org.springframework.xml.xsd.SimpleXsdSchema"> 
     <property 
      name="xsd" 
      value="/mypackage/my.xsd"> 
     </property> 
</bean> 

Maggiori informazioni (tra cui un esempio) può essere trovato al seguente link: Static WSDL with imported XML Schema in Spring Web Service

+0

Che funziona anche con WSDL dinamico – mwhs

2

Di seguito è la configurazione di JAva per esporre lo schema. Questo ha funzionato per me. Si noti che il nome dello schema deve corrispondere al nome e al nome del metodo Bean. Questo è molto importante perché funzioni. così ho mantenuto il nome e XSD Bean nome come "CustomerDetailsSchema" e assicurarsi che il costruttore per getCustomerDetails corrisponde anche il nome

@Bean(name = "customerDetails") 
public DefaultWsdl11Definition getCustomerDetails(XsdSchema CustomerDetailsSchema) { 
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); 
    wsdl11Definition.setPortTypeName("..."); 
    wsdl11Definition.setServiceName("..."); 
    wsdl11Definition.setLocationUri("/webservice"); 
    wsdl11Definition.setTargetNamespace("..."); 
    wsdl11Definition.setSchema(CustomerDetailsSchema); 
    return wsdl11Definition; 
} 

@Bean(name = "CustomerDetailsSchema") 
public XsdSchema CustomerDetailsSchema() { 
    return new SimpleXsdSchema(new ClassPathResource("schemas/CustomerDetailsSchema.xsd")); 
} 
Problemi correlati