2012-03-02 17 views
6

tengo un módulo donde tengo mis esquemas XSD, donde uno puede hacer referencia a un esquema de otra utilizando la ruta relativa dentro ubicación del esquema:publicación estática WSDL y esquemas XSD relacionados utilizando Spring WS

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

Aquí estoy también usando xjc para generar beans Jaxb a partir de estos esquemas xsd.

Ahora tengo un módulo donde está implementado mi servicio web, usando spring-ws (2.0.4). Y quiero usar WSDL estático y publicarlo con los esquemas xsd, donde las ubicaciones del esquema se transformarán en URL como 'http://myerver.url.com/my.xsd'.

La pregunta es ¿cómo lograr esto elegantemente?

(Alternativamente combinar los XSD en un esquema y que a WSDL)

(En teoría que podría transformar estos XSD usando un guión y añadirlos a los recursos (XSD y WSDL) a un (despachador de primavera) servlet pero no me parece muy cómodo)

+0

comentario rápido ... usted no será capaz de combinar las XSDs en uno ya que está usando una declaración < xs: import />; solo puede tener un espacio de nombres de destino por archivo XSD. Sin embargo, podría alinear todos los XSD, sin importar espacios de nombres, en la sección wsdl: types, en cuyo caso todas sus importaciones deberían descartar los atributos schemaLocation. Más tarde ... –

+0

Hola, lo que no quiero hacer es este manual en línea. Entonces esta solución es si pudiera hacerse sin muchos problemas, como usar una lib general que me lo haga. – csviri

+0

Finalmente lo resolvió mediante una implementación de servlet propio. – csviri

Respuesta

9

El servicio web de Spring tiene una manera de hacerlo elegantemente en realidad. Todo lo que necesita hacer es definir un grano SimpleXsdSchema con el identificador de la derecha (que se utiliza como el nombre xsd sin .xsd) en el archivo XML de definición de frijol, algo parecido a continuación

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

Más información (incluyendo un ejemplo) se puede encontrar en el siguiente enlace: Static WSDL with imported XML Schema in Spring Web Service

+0

Eso también funciona con WSDL dinámico – mwhs

2

A continuación se muestra la configuración de JAva para exponer el esquema. Esto funcionó para mí. Tenga en cuenta que el nombre del esquema debe coincidir con el nombre del Bean y el nombre del método. Esto es muy importante para que esto funcione. así que seguí el nombre XSD y Bean nombre como "CustomerDetailsSchema" y asegúrese de que el constructor para getDetallesCliente también coincide con el nombre

@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")); 
} 
Cuestiones relacionadas