Diferencia entre revisiones de «Spring Web Services»

De Dos Ideas.
Saltar a: navegación, buscar
m (Interceptor de validaciones)
Línea 42: Línea 42:
 
Ejemplo:
 
Ejemplo:
 
<code xml>
 
<code xml>
<bean id="validatingInterceptor"
+
<bean id="validatingInterceptor"
        class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
+
    class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
        <property name="xsdSchemaCollection" ref="schemaCollection" />
+
    <property name="xsdSchemaCollection" ref="schemaCollection" />
        <property name="validateRequest" value="true"/>
+
    <property name="validateRequest" value="true"/>
        <property name="validateResponse" value="true"/>
+
    <property name="validateResponse" value="true"/>
</bean>
+
</bean>
 
</code>
 
</code>
 
Este bean hace referencia a los esquemas(.xsd) y al interpretarlos puede saber la estructura y restricciones de los request/response.
 
Este bean hace referencia a los esquemas(.xsd) y al interpretarlos puede saber la estructura y restricciones de los request/response.
Línea 54: Línea 54:
  
 
<code xml>
 
<code xml>
    <bean id="schemaCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
+
<bean id="schemaCollection"
        <property name="xsds">
+
    class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
            <list>
+
    <property name="xsds">
                <value>/WEB-INF/contratoDeDatos.xsd</value>
+
        <list>
            </list>
+
            <value>/WEB-INF/contratoDeDatos.xsd</value>
        </property>
+
        </list>
        <property name="inline" value="true"/>
+
    </property>
    </bean>
+
    <property name="inline" value="true"/>
 +
</bean>
 
</code>
 
</code>
  

Revisión del 15:12 12 mar 2010

Spring Web Services (Spring-WS) es un producto de Spring Framework para facilitar la creación de servicios web basados en el intercambio de documentos (document driven).

Spring-WS Se basa en servicios en los cuales primero se establece un contrato y luego se implementan (contract first), evitando atar al contrato como sucede en los casos en los cuales se genera el mismo a partir de las clases java.

Las principales características de SpringWS

Facilita aplicar las mejores practicas para la creación de servicios web Facilidad para distribuir los pedidos xml a través de diferentes tipos de mapeos Soporte para varias librerias de manejo de XML (DOM, SAX, StAX, JDOM, dom4j, XDOM) Soporte para mapeo de xml a objetos (Castor, JiBX, JAXB, XStream) Integración con Spring Framework

Dos ideas cuenta con un curso para exponer y consumir webservices con SpringWS. Haga click para ingresar.

Interceptores

Si usamos org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping para hacer el binding de los endpoints podemos agregar varios interceptores. Solo hay que definirlos dentro de la lista de interceptores que tiene como opción la clase.

Ejemplo: <bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">

   <property name="mappings">
       <props>
           <prop key="{http://dosideas.com/oc/schemas}OrdenDeCompraRequest">ordenDeCompraMarshallingEndPoint</prop>
           <prop key="{http://dosideas.com/oc/schemas}ConsultaPrecioRequest">consultaPrecioMessageEndpoint</prop>
       </props>
   </property>
   <property name="interceptors">
       <list>
           <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/>
           <ref bean="validatingInterceptor"/>
       </list>
   </property>

</bean>

Interceptor de validaciones

El interceptor de validaciones es una herramienta muy útil, que nos permite verificar tanto el request como el response del web service. Verifica tanto el esquema de los xmls como las restricciones que tiene cada uno de los elementos de los xsd. Si alguna de las validaciones no se cumple devuelve un fault si es un request, y genera un warning en el log si es un response.

Ejemplo: <bean id="validatingInterceptor"

   class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
   <property name="xsdSchemaCollection" ref="schemaCollection" />
   <property name="validateRequest" value="true"/>
   <property name="validateResponse" value="true"/>

</bean> Este bean hace referencia a los esquemas(.xsd) y al interpretarlos puede saber la estructura y restricciones de los request/response.

Ejemplo:

<bean id="schemaCollection"

   class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
   <property name="xsds">
       <list>
           <value>/WEB-INF/contratoDeDatos.xsd</value>
       </list>
   </property>
   <property name="inline" value="true"/>

</bean>

Si el servicio tiene más de una operación, existirán varios xsd. Actualmente existe un error al querer ingresar más de un xsd(el interceptor ve solo el primero). Para salvar este error se aconseja generar un nuevo .xsd que incluya los definidos para cada operación.

Ejemplo de contratoDeDatos.xsd agrupador:

<?xml version="1.0" encoding="UTF-8"?> <xsd:schema targetNamespace="http://www.movistar.com.ar/ws/schema/cater" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.movistar.com.ar/ws/schema/cater">

   <xsd:include schemaLocation="validarCentroEmisor.xsd"></xsd:include>
   <xsd:include schemaLocation="agenteUsuario.xsd"></xsd:include>
   <xsd:include schemaLocation="validarFactura.xsd"></xsd:include>

</xsd:schema>

Ver también