2010-03-04 7 views
2

J'ai un webservice de printemps pour lequel je le schéma dans un répertoire que:Carte printemps un fichier à une URL/URI

  • WebRoot/DataContract/Person.xsd
  • WebRoot/DataContract/sous- Person.xsd

Où sous-Person.xsd est inclus dans Person.xsd qui est:

dans Person.xsd:

<xsd:import  namespace="http://www.mynamespace.org/xml/sub-person" 
       schemaLocation="sub-person.xsd"/> 

J'ai défini le wsdl comme:

<bean id="personserv" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"> 
    <property name="schemaCollection" ref="schemaCollection"/>            
    <property name="portTypeName" value="personserv"/>         
    <property name="locationUri" value="/ws/personnelService/"/>        
    <property name="targetNamespace" value="http://www.mynamespace.org/definitions"/>  
</bean> 

Je peux accéder au fichier WSDL à l'aide:

http://localhost:8080/myapp/ws/personnelService/personserv.wsdl

Cependant, lors de l'utilisation de ce wsdl le client peut chercher Person.xsd et ne peut pas chercher sous-Person.xsd donnant une erreur n'a pas pu charger

http://localhost:8080/myapp/ws/personnelService/sub-person.xsd

Ma question est comment puis-je rendre sub-person.xsd disponible à cet emplacement URI?

J'ai également changé l'emplacement spécifié dans Person.xsd comme:

<xsd:import  namespace="http://www.mynamespace.org/xml/sub-person" 
       schemaLocation="/DataContract/sub-person.xsd"/> 

que le client a ensuite tenté de trouver sous-Person.xsd à:

http://localhost:8080/sub-person.xsd ce qui est inexact.

Une autre tentative:

<xsd:import  namespace="http://www.mynamespace.org/xml/sub-person" 
       schemaLocation="DataContract/sub-person.xsd"/> 

que le client a ensuite tenté de trouver sous-Person.xsd à:

http://localhost:8080/myapp/ws/personnelService/DataContract/sub-person.xsd

+0

vous pouvez utiliser '.' et' ..' pour faire des chemins relatifs. Essayez cela et voir –

+0

Je l'ai essayé, mais cela ne fonctionne pas :( – saky

+0

Je me demande s'il existe une Ressource de Ressort qui peut être définie comme des servlets – saky

Répondre

1

Spring-WS a ce really nice facility pour manipuler ce, en utilisant du projet Apache XML Commons:

<bean id="schemaCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection"> 
    <property name="xsds"> 
     <list> 
      <value>/DataContract/person.xsd</value> 
      <value>/DataContract/sub-person.xsd</value> 
     </list> 
    </property> 
    <property name="inline" value="true"/> 
</bean> 

La propriété inline est la clé - elle lit dans chaque fichier de schéma et chaque fois qu'elle trouve une référence import ou include de l'une à l'autre, elle remplace la référence par le contenu du fichier référencé.

L'effet de ceci est que la sortie du contrôleur de génération WSDL est un fichier unique avec toutes les informations de schéma en ligne, tout en gardant les différents fichiers de schéma séparés sur le serveur. Vous n'avez alors pas à vous soucier de savoir si le client peut suivre les références et les résoudre correctement, car sont aucune référence.

+0

Merci qui a résolu le problème. J'avais omis la propriété 'inline' de schemaCollection, je ne suis pas sûr que ce soit une bonne idée d'avoir un fichier wsdl volumineux. – saky

+0

@saky: l'insertion des fichiers de schéma peut faire toute la différence en termes de performances – skaffman