1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:sws="http://www.springframework.org/schema/web-services"
6 xmlns:oxm="http://www.springframework.org/schema/oxm"
7 xmlns:aop="http://www.springframework.org/schema/aop"
8 xmlns:util="http://www.springframework.org/schema/util"
9 xmlns:p="http://www.springframework.org/schema/p"
11 xsi:schemaLocation="http://www.springframework.org/schema/beans
12 http://www.springframework.org/schema/beans/spring-beans.xsd
13 http://www.springframework.org/schema/context
14 http://www.springframework.org/schema/context/spring-context.xsd
15 http://www.springframework.org/schema/web-services
16 http://www.springframework.org/schema/web-services/web-services.xsd
17 http://www.springframework.org/schema/oxm
18 http://www.springframework.org/schema/oxm/spring-oxm.xsd
19 http://www.springframework.org/schema/util
20 http://www.springframework.org/schema/util/spring-util.xsd">
23 This file is an example about how someone should write code in order to send and
24 receive data from the Web Services.
27 <!-- Searches for beans in packages (instead of XML configuration we can use in this way annotations like @Service, @Component, etc, etc) -->
28 <context:component-scan base-package="de.spring.webservices"/>
31 Three ways of using a marshallers/unmarshallers.
33 1. No declarar nada en el XML y dejar que Spring lo haga internamente todo por nosotros.
34 Esto equivale a esta configuracion en XML
36 <oxm:jaxb2-marshaller id="marshaller" context-path="de.spring.webservices"/>
37 El context-path Spring supongo que lo rellena automáticamente en base al component-scan declarado arriba.
39 2. Especificando el context-path para ser escaneado por Spring usando anotaciones. Esto
42 <oxm:jaxb2-marshaller id="marshaller" context-path="de.spring.webservices.auto"/>
43 Esto es lo mismo que haría Spring si no declaramos nada en el XML pero así tenemos opción de
44 de especificar un context-path en concreto.
46 3. Especificando la implementación concreta del marshaller.
47 Con esta opción además puedo usar packagesToScan, contest-path si no recuerdo mal tenía problemas
48 cuando había dos ObjectFactory con el mismo package. Uno está en globalxsds y otro en este proyecto.
49 De todos modos, probablemente habría que usar un package distinto para lo que hay
50 en globalxsds (quizás incluso basado en el namespace del xsd) y así podría evitar esta configuración.
52 <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
54 maven-jaxb2-plugin for WSDL DOES generate again the objects in web-services-spring-jaxb2-globalxsds :(
55 So we MAY NOT scan everything because there is more than one class representing
56 the same XML element. :(
58 We scan the objects generated in this package.
60 <property name="packagesToScan" value="de.spring.webservices.client.auto"/>
64 <!-- Required in order to use SOAP 1.2
65 id="messageFactory" is not a random choice, if you use another name it will not work
66 (Spring will end up loading SOAP 1.1)
68 <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
69 <property name="soapVersion">
70 <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" />
76 ¿Este validador funciona teniendo inheritance en el xsd? (inheritances es una cosa especial
77 del JAXB2 que estoy usando para generar las clases desde el xsd)
78 Parece que el unmarshal (que supongo que se hace con el JAXB2 que está en el classpath
79 debido al tipo de Endpoint que estoy usando, que por cierto no sé cual JAXB2 está cogiendo realmente)
80 funciona, así que supongo el validador tambien :/
81 Lo que realmente tampoco sé es si hay alguna relación entre los validadores y JAXB2 :/
83 <bean id="payloadValidatingInterceptor"
84 class="org.springframework.ws.client.support.interceptor.PayloadValidatingInterceptor">
85 <property name="schemas">
88 ALWAYS FIRST THE XSD FILES TO BE IMPORTED!!!!! O.o
89 OTHERWISE THE import IN examples.xsd WILL BE SOLVED BY MEANS OF DOWNLOADING THE
90 EXTERNAL parent.xsd (USING THE URL LINKED BY THE IMPORT STATEMENT IN examples.xsd)
92 IF YOU DON'T DO THIS, PayloadValidatingInterceptor WILL TRY TO CONNECT TO THE
93 EXTERNAL SERVER WHERE parent.xsd IS LOCATED AND IT WILL FAIL IF BECAUSE SOME
94 REASON YOU DON'T HAVE IN THAT VERY MOMENT NETWORK CONNECTION. SO, DON'T MESS WITH THIS
97 <value>classpath:schemas/parent.xsd</value>
99 <value>classpath:schemas/examples.xsd</value>
102 <property name="validateRequest" value="true"/>
103 <property name="validateResponse" value="true"/>
107 Los errores de validacion se devuelven así:
109 <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
114 <env:Value>env:Sender</env:Value>
117 <env:Text xml:lang="en">Validation error</env:Text>
120 <spring-ws:ValidationError xmlns:spring-ws="http://springframework.org/spring-ws">cvc-maxLength-valid: El valor 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' con la longitud = '91' no es de faceta válida con respecto a maxLength '30' para el tipo 'limitedString'.</spring-ws:ValidationError>
121 <spring-ws:ValidationError xmlns:spring-ws="http://springframework.org/spring-ws">cvc-type.3.1.3: El valor 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' del elemento 'exam:data' no es válido.</spring-ws:ValidationError>
127 El manejador de errores de validación es implementado por AbstractValidatingInterceptor (PayloadValidatingInterceptor)
128 luego si quisiéramos loguear los mensaje de error de validación de algún modo especial tendríamos que crear nuestro propio PayloadValidatingInterceptor :(
131 <!-- Enables us to log custom Fault remote messages. No loguea mensajes de error de validación :( -->
132 <bean id="customFaultMessageResolver" class="de.spring.webservices.client.CustomFaultMessageResolver">
133 <property name="unmarshaller" ref="marshaller"/>
137 WebServiceTemplate using these strategies by default (see WebServiceTemplate.properties file)
139 org.springframework.ws.client.core.FaultMessageResolver=org.springframework.ws.soap.client.core.SoapFaultMessageResolver
140 org.springframework.ws.WebServiceMessageFactory=org.springframework.ws.soap.saaj.SaajSoapMessageFactory
141 org.springframework.ws.transport.WebServiceMessageSender=org.springframework.ws.transport.http.HttpUrlConnectionMessageSender
145 <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
146 <constructor-arg ref="messageFactory"/>
147 <property name="marshaller" ref="marshaller" />
148 <property name="unmarshaller" ref="marshaller" />
150 <!-- For local deployments change to http://localhost:8080/web-services-spring-jaxb2-server/spring-ws/example -->
151 <property name="defaultUri" value="http://gumartinm.name/spring-ws/example"/>
153 <property name="interceptors">
155 <ref bean="payloadValidatingInterceptor" />
159 <property name="faultMessageResolver" ref="customFaultMessageResolver" />
161 <property name="messageSenders">
163 <bean class="de.spring.webservices.client.transport.http.CustomHttpRequestMessageSender">
165 <bean class="org.springframework.http.client.SimpleClientHttpRequestFactory"
167 p:connectTimeout="1000" />
175 Using @Service and @Autowired
176 We could use just XML configuration, or XML confirguration and @Autowired or as I am doing now @Service and @Autowired.
177 <bean id="exampleClientService" class="de.spring.webservices.client.ExampleClientService">
179 @Autowired works even using XML configuration as long as you use context:component-scan
180 <property name="webServiceTemplate" ref="webServiceTemplate"/>