cb926e725fc46ee9f10cdcebe0be6843985b127d
[SpringWebServicesForFun/.git] /
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"
10
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">
21
22     <!-- 
23         This file is an example about how someone should write code in order to send and
24         receive data from the Web Services.
25     -->
26    
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"/>
29
30     <!--
31         Three ways of using a marshallers/unmarshallers.
32         
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
35         
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.
38         
39         2. Especificando el context-path para ser escaneado por Spring usando anotaciones. Esto
40         se hace de este modo:
41         
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.
45         
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.
51         
52         
53         <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
54                 <property name="packagesToScan" value="de.spring.webservices.auto"/>
55                 </bean>
56                 
57         NO PUEDO USAR ESTA CONFIGURACION PORQUE SE PRODUCE ESTE ERROR:
58         
59         Caused by: org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception;
60         nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
61                 de.spring.webservices.auto.Examples es una interfaz y JAXB no puede manejar interfaces.
62                         this problem is related to the following location: at de.spring.webservices.auto.Examples
63
64                         at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:888)
65                         
66                 ESTE ERROR SE PRODUCE PORQUE cxf-codegen-plugin GENERA Examples QUE ES UN inteface @WebService
67                 maven-jaxb2-plugin NO GENERA ESTOS OBJETOS pero maven-jaxb2-plugin NO ES BUENO PARA GENERAR CLASES
68                 DESDE WSDLs POR LAS RAZONES EXPLICADAS EN EL pom.xml DEL PROYECTO web-services-spring-jaxb2-client.
69      -->
70      <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
71         <!-- 
72                 contextPath because of Examples autogenerated class, which is an @Weberservice interface.
73                 
74                 cxf-codegen-plugin DOES generate again the objects in web-services-spring-jaxb2-globalxsds :(
75                 So we MAY NOT scan everything because there is more than one class representing
76                 the same XML element. :(
77                 
78                 We scan the objects generated in this package.
79          -->
80         <property name="contextPath" value="de.spring.webservices.client.auto:name.gumartinm.spring_ws.parent"/>
81          </bean>
82         
83      
84    
85     <!-- Required in order to use SOAP 1.2
86          id="messageFactory" is not a random choice, if you use another name it will not work
87          (Spring will end up loading SOAP 1.1)
88     -->
89     <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
90         <property name="soapVersion">
91             <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" />
92         </property>
93     </bean> 
94     
95
96     <!-- 
97         ¿Este validador funciona teniendo inheritance en el xsd? (inheritances es una cosa especial 
98         del JAXB2 que estoy usando para generar las clases desde el xsd)
99         Parece que el unmarshal (que supongo que se hace con el JAXB2 que está en el classpath
100         debido al tipo de Endpoint que estoy usando, que por cierto no sé cual JAXB2 está cogiendo realmente) 
101         funciona, así que supongo el validador tambien :/
102         Lo que realmente tampoco sé es si hay alguna relación entre los validadores y JAXB2 :/
103     -->
104     <bean id="payloadValidatingInterceptor" 
105         class="org.springframework.ws.client.support.interceptor.PayloadValidatingInterceptor">
106         <property name="schemas">
107             <list>
108                 <!--
109                         ALWAYS FIRST THE XSD FILES TO BE IMPORTED!!!!!  O.o
110                         OTHERWISE THE import IN examples.xsd WILL BE SOLVED BY MEANS OF DOWNLOADING THE
111                         EXTERNAL parent.xsd (USING THE URL LINKED BY THE IMPORT STATEMENT IN examples.xsd)
112                                  
113                                 IF YOU DON'T DO THIS, PayloadValidatingInterceptor WILL TRY TO CONNECT TO THE
114                                 EXTERNAL SERVER WHERE parent.xsd IS LOCATED AND IT WILL FAIL IF BECAUSE SOME
115                                 REASON YOU DON'T HAVE IN THAT VERY MOMENT NETWORK CONNECTION. SO, DON'T MESS WITH THIS
116                                 CONFIGURATION.
117                  -->
118                  <value>classpath:parent.xsd</value>
119                     
120                  <value>classpath:examples.xsd</value>
121             </list>
122         </property>
123         <property name="validateRequest" value="true"/>
124         <property name="validateResponse" value="true"/>
125     </bean>
126     
127         <!-- 
128                 Los errores de validacion se devuelven así:
129                 
130                 <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
131                    <env:Header/>
132                    <env:Body>
133                       <env:Fault>
134                          <env:Code>
135                             <env:Value>env:Sender</env:Value>
136                          </env:Code>
137                          <env:Reason>
138                             <env:Text xml:lang="en">Validation error</env:Text>
139                          </env:Reason>
140                          <env:Detail>
141                             <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>
142                             <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>
143                          </env:Detail>
144                       </env:Fault>
145                    </env:Body>
146                 </env:Envelope>
147                 
148                 El manejador de errores de validación es implementado por AbstractValidatingInterceptor (PayloadValidatingInterceptor)
149                 luego si quisiéramos loguear los mensaje de error de validación de algún modo especial tendríamos que crear nuestro propio PayloadValidatingInterceptor :(
150          -->
151     
152     <!-- Enables us to log custom Fault remote messages. No loguea mensajes de error de validación :( -->
153     <bean id="customFaultMessageResolver" class="de.spring.webservices.client.CustomFaultMessageResolver">
154                 <property name="unmarshaller" ref="marshaller"/>
155         </bean>
156     
157     <!-- 
158     WebServiceTemplate using these strategies by default (see WebServiceTemplate.properties file)
159     
160     org.springframework.ws.client.core.FaultMessageResolver=org.springframework.ws.soap.client.core.SoapFaultMessageResolver
161         org.springframework.ws.WebServiceMessageFactory=org.springframework.ws.soap.saaj.SaajSoapMessageFactory
162         org.springframework.ws.transport.WebServiceMessageSender=org.springframework.ws.transport.http.HttpUrlConnectionMessageSender
163     
164      -->
165
166     <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
167         <constructor-arg ref="messageFactory"/>
168         <property name="marshaller" ref="marshaller" />
169         <property name="unmarshaller" ref="marshaller" />
170
171         <!-- For local deployments change to http://localhost:8080/web-services-spring-cxf-server/spring-ws/example -->
172         <property name="defaultUri" value="http://gumartinm.name/spring-ws/example"/>
173
174         <property name="interceptors">
175             <list>
176                 <ref bean="payloadValidatingInterceptor" />
177             </list>
178         </property>
179         
180         <property name="faultMessageResolver" ref="customFaultMessageResolver" />
181         
182         <property name="messageSenders">
183                 <list>
184                 <bean class="de.spring.webservices.client.transport.http.CustomHttpRequestMessageSender">
185                        <constructor-arg>
186                                <bean class="org.springframework.http.client.SimpleClientHttpRequestFactory"
187                                        p:readTimeout="2000"
188                                        p:connectTimeout="1000" />
189                        </constructor-arg>
190                 </bean>
191                 </list>
192         </property>
193     </bean>
194     
195     <!--
196     Using @Service and @Autowired
197     We could use just XML configuration, or XML confirguration and @Autowired or as I am doing now @Service and @Autowired.
198     <bean id="exampleClientService" class="de.spring.webservices.client.ExampleClientService">
199         
200         @Autowired works even using XML configuration as long as you use context:component-scan
201         <property name="webServiceTemplate" ref="webServiceTemplate"/>
202     </bean>
203     -->
204     
205 </beans>