TODO: maven-jaxb2-plugin in order to reuse generated Java code from other projects (cxf-xjc-plugin doesn't implement such feature
without generating episodes by myself)
-TODO: custom bindings when creating Java code from wsdl.
TODO: using Jetty instead of Tomcat
TODO: logging Spring information
-TODO: integration tests (client and server)
For debugging: export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y"
<url>http://gumartinm.name</url>
<properties>
- <project.wsdl.sources.path>src/main/resources/wsdl</project.wsdl.sources.path>
+ <project.wsdl.sources.path>src/main/build-resources/wsdl</project.wsdl.sources.path>
<project.wsdl.target.path>${basedir}/target/generated-sources/src/main/java</project.wsdl.target.path>
- <project.bindings.path>src/main/resources/bindings</project.bindings.path>
+ <project.bindings.path>src/main/build-resources/bindings</project.bindings.path>
+ <!-- Requires absolute path (because of that I am using ${basedir} -->
+ <project.catalogs.path>${basedir}/src/main/build-resources/catalogs</project.catalogs.path>
</properties>
<dependencies>
<artifactId>jdom</artifactId>
</dependency>
+
+ <!-- Global types -->
+ <dependency>
+ <groupId>de.spring.webservices</groupId>
+ <artifactId>web-services-spring-globalxsds</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+
<!-- Required by spring-ws-core -->
<dependency>
<groupId>wsdl4j</groupId>
<goal>wsdl2java</goal>
</goals>
<configuration>
+ <fork>true</fork>
<sourceRoot>${project.wsdl.target.path}</sourceRoot>
<wsdlOptions>
<wsdlOption>
<extraargs>
<extraarg>-xjc-Xinheritance</extraarg>
<extraarg>-xjc-Xannotate</extraarg>
+ <extraarg>-catalog</extraarg>
+ <extraarg>${project.catalogs.path}/catalog.cat</extraarg>
<extraarg>-verbose</extraarg>
</extraargs>
</wsdlOption>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<jaxws:bindings
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
+ xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
+ xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
+ xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
+ xmlns:annox="http://annox.dev.java.net"
+ jaxb:version="2.1"
+ jaxb:extensionBindingPrefixes="xjc inheritance annox">
+
+ <jaxws:bindings
+ node="wsdl:definitions">
+ <jaxws:package name="de.spring.webservices.auto"/>
+ </jaxws:bindings>
+
+
+ <!--
+ XSD namespace for included schema in WSDL: http://gumartinm.name/spring-ws/example
+
+ I am skiping the XSD namespace for imported schema in WSDL: http://gumartinm.name/spring-ws/parent because I guess,
+ there must be some way of using the already generated code in web-services-spring-globalxsds instead of generating new one
+ (perhaps using maven-jaxb2-plugin with episodes)
+ -->
+ <jaxws:bindings
+ node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://gumartinm.name/spring-ws/example']">
+
+ <jaxb:schemaBindings>
+ <jaxb:package name="de.spring.webservices.auto"/>
+ </jaxb:schemaBindings>
+
+ <jaxb:bindings node="//xs:element[@name='CustomBindingExampleRequest']/xs:complextype">
+ <inheritance:implements>de.spring.webservices.operations.Request</inheritance:implements>
+ <annox:annotate>@java.lang.suppresswarnings({"unchecked","rawtypes"})</annox:annotate>
+ </jaxb:bindings>
+
+ <jaxb:bindings node="//xs:element[@name='CustomBindingExampleResponse']/xs:complextype">
+ <inheritance:implements>de.spring.webservices.operations.Response</inheritance:implements>
+ <annox:annotate>@java.lang.suppresswarnings({"unchecked","rawtypes"})</annox:annotate>
+ </jaxb:bindings>
+
+ <jaxb:globalBindings>
+ <xjc:javaType adapter="de.spring.webservices.binders.XSDateTimeCustomBinder"
+ name="java.util.Date" xmlType="xs:dateTime" />
+ </jaxb:globalBindings>
+
+ </jaxws:bindings>
+
+</jaxws:bindings>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE catalog
- PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
- "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
-<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"
- prefer="public">
-
-<!-- prefer="uri" -->
-
-
- <rewriteURI uriStartString="http://gumartinm.name/spring-ws/parent/"
- rewritePrefix="classpath:/"/>
-
- <rewriteSystem systemIdStartString="http://gumartinm.name/spring-ws/parent/" rewritePrefix="classpath:/"/>
-
-</catalog>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefer="system|public" >
+
+ <!--
+ An XML catalog will allow us to specify real locations for our imported XML schemas.
+ The XJC tool supports several different XML Catalog formats: TR9401, XCatalog, OASIS XML Catalog.
+ I am using OASIS XML Catalog Format
+
+ OASIS XML Catalog Format: https://www.oasis-open.org/committees/entity/specs/cs-entity-xml-catalogs-1.0.html
+ TR9401: https://www.oasis-open.org/specs/a401.htm
+
+
+ See: http://labs.bsb.com/2011/01/usage-of-an-xml-catalog-in-the-xmlbeans-cxf-integration/
+ http://cxf.apache.org/cxf-xjc-plugin.html
+ https://jaxb.java.net/2.2.4/docs/catalog.html
+ -->
+
+
+ <!-- I JUST NEED THIS CONFIGURATION, ANYHOW I AM WRITING ALL OF THEM -->
+ <rewriteSystem systemIdStartString="http://gumartinm.name/spring-ws/parent"
+ rewritePrefix="classpath:parent.xsd"/>
+
+
+ <!-- THE FOLLOWING ONES ARE NOT REQUIRED EVEN IF I AM WRITING THEM -->
+ <public
+ publicId="http://gumartinm.name/spring-ws/parent"
+ uri="classpath:parent.xsd"/>
+
+
+ <system
+ systemId="http://gumartinm.name/spring-ws/parent/parent.xsd"
+ uri="classpath:parent.xsd"/>
+
+
+ <rewriteURI uriStartString="http://gumartinm.name/spring-ws/parent"
+ rewritePrefix="classpath:parent.xsd"/>
+
+</catalog>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="http://gumartinm.name/spring-ws/example" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://gumartinm.name/resource/wsdl/schemas" targetNamespace="http://gumartinm.name/resource/wsdl/schemas">
+ <wsdl:types>
+ <xs:schema xmlns:annox="http://annox.dev.java.net" xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:parent="http://gumartinm.name/spring-ws/parent" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" jaxb:extensionBindingPrefixes="inheritance annox" jaxb:version="2.1" targetNamespace="http://gumartinm.name/spring-ws/example">
+
+ <!--
+ We are going to use catalog.cat in order to avoid downloading parent.xsd from remote server
+ -->
+ <xs:import namespace="http://gumartinm.name/spring-ws/parent" schemaLocation="http://gumartinm.name/spring-ws/parent/parent.xsd"/>
+
+
+ <!-- Using inheritance and annox plugin -->
+ <xs:element name="ExampleRequest">
+ <xs:complexType>
+ <xs:annotation>
+ <xs:appinfo>
+ <annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
+ <inheritance:implements>de.spring.webservices.operations.Request</inheritance:implements>
+ </xs:appinfo>
+ </xs:annotation>
+ <xs:all>
+ <xs:element name="data" type="xs:string"/>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ExampleResponse">
+ <xs:complexType>
+ <xs:annotation>
+ <xs:appinfo>
+ <inheritance:implements>de.spring.webservices.operations.Response</inheritance:implements>
+ </xs:appinfo>
+ </xs:annotation>
+ <xs:all>
+ <xs:element name="data" type="xs:string"/>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+
+
+ <!-- Using custombinding.xjb instead of inheritance plugin.
+ Useful when you can not modify your xsd files because they are provided
+ by another person or company
+ -->
+ <xs:element name="CustomBindingExampleRequest">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="data" type="xs:string"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="exampleDate" type="xs:dateTime"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="parentEnum" type="parent:parentEnumType"/>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="CustomBindingExampleResponse">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="data" type="xs:string"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="exampleDate" type="xs:dateTime"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="parentEnum" type="parent:parentEnumType"/>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+
+
+</xs:schema>
+ </wsdl:types>
+ <wsdl:message name="CustomBindingExampleRequest">
+ <wsdl:part element="sch:CustomBindingExampleRequest" name="CustomBindingExampleRequest">
+ </wsdl:part>
+ </wsdl:message>
+ <wsdl:message name="ExampleRequest">
+ <wsdl:part element="sch:ExampleRequest" name="ExampleRequest">
+ </wsdl:part>
+ </wsdl:message>
+ <wsdl:message name="ExampleResponse">
+ <wsdl:part element="sch:ExampleResponse" name="ExampleResponse">
+ </wsdl:part>
+ </wsdl:message>
+ <wsdl:message name="CustomBindingExampleResponse">
+ <wsdl:part element="sch:CustomBindingExampleResponse" name="CustomBindingExampleResponse">
+ </wsdl:part>
+ </wsdl:message>
+ <wsdl:portType name="Examples">
+ <wsdl:operation name="CustomBindingExample">
+ <wsdl:input message="tns:CustomBindingExampleRequest" name="CustomBindingExampleRequest">
+ </wsdl:input>
+ <wsdl:output message="tns:CustomBindingExampleResponse" name="CustomBindingExampleResponse">
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="Example">
+ <wsdl:input message="tns:ExampleRequest" name="ExampleRequest">
+ </wsdl:input>
+ <wsdl:output message="tns:ExampleResponse" name="ExampleResponse">
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:portType>
+ <wsdl:binding name="ExamplesSoap12" type="tns:Examples">
+ <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+ <wsdl:operation name="CustomBindingExample">
+ <soap12:operation soapAction=""/>
+ <wsdl:input name="CustomBindingExampleRequest">
+ <soap12:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output name="CustomBindingExampleResponse">
+ <soap12:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ <wsdl:operation name="Example">
+ <soap12:operation soapAction=""/>
+ <wsdl:input name="ExampleRequest">
+ <soap12:body use="literal"/>
+ </wsdl:input>
+ <wsdl:output name="ExampleResponse">
+ <soap12:body use="literal"/>
+ </wsdl:output>
+ </wsdl:operation>
+ </wsdl:binding>
+ <wsdl:service name="ExamplesService">
+ <wsdl:port binding="tns:ExamplesSoap12" name="ExamplesSoap12">
+ <soap12:address location="http://localhost:8080/web-services-spring-server/spring-ws/example"/>
+ </wsdl:port>
+ </wsdl:service>
+</wsdl:definitions>
package de.spring.webservices.client;
-import name.gumartinm.spring_ws.example.CustomBindingExampleRequest;
-import name.gumartinm.spring_ws.example.CustomBindingExampleResponse;
-import name.gumartinm.spring_ws.example.ExampleRequest;
-import name.gumartinm.spring_ws.example.ExampleResponse;
-import name.gumartinm.spring_ws.example.Examples;
-import name.gumartinm.spring_ws.example.ExamplesService;
+import name.gumartinm.spring_ws.parent.ParentEnumType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.client.core.WebServiceTemplate;
+import de.spring.webservices.auto.CustomBindingExampleRequest;
+import de.spring.webservices.auto.CustomBindingExampleResponse;
+import de.spring.webservices.auto.ExampleRequest;
+import de.spring.webservices.auto.ExampleResponse;
+import de.spring.webservices.auto.Examples;
+import de.spring.webservices.auto.ExamplesService;
+
/**
* Someone could write code like this one in order to send and receive
* information from our Web Services.
*
*/
-public class ExampleClientService {
+public class ExampleClientService {
private final WebServiceTemplate webServiceTemplate;
@Autowired
final CustomBindingExampleRequest customBindingxampleRequest =
new CustomBindingExampleRequest();
customBindingxampleRequest.setData("CUSTOM BINDING JAVA. SCARLETT. IT IS CANON.");
+ customBindingxampleRequest.setParentEnum(ParentEnumType.FIRST);
final Examples exampleService = new ExamplesService().getExamplesSoap12();
final CustomBindingExampleResponse customBindingExampleResponse =
package de.spring.webservices.client;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
+import de.spring.webservices.auto.CustomBindingExampleResponse;
+import de.spring.webservices.auto.ExampleResponse;
+
/**
* This class is used just like a nice example about how to write and run client
* code which will send data to and from the Web Services.
*
*/
public class MainTest {
+ private static final Logger logger = LoggerFactory.getLogger(MainTest.class);
+
public ApplicationContext context;
/**
final MainTest test = new MainTest();
test.context = new ClassPathXmlApplicationContext(
- "client-spring-configuration.xml");
+ "classpath:spring-configuration/ws/client-spring-configuration.xml");
final ExampleClientService example =
(ExampleClientService) test.context.getBean("exampleClient");
- example.sendAndReceiveJava();
- example.sendAndReceiveJavaCustom();
- example.sendAndReceiveSpring();
- example.sendAndReceiveSpringCustom();
+ logger.info("ExampleResponse Java:");
+ ExampleResponse response = example.sendAndReceiveJava();
+ logger.info(response.getData());
+
+
+ logger.info("CustomBindingExampleResponse Java:");
+ CustomBindingExampleResponse customBindingResponse = example.sendAndReceiveJavaCustom();
+ logger.info(customBindingResponse.getData());
+
+
+ logger.info("ExampleResponse Spring:");
+ response = example.sendAndReceiveSpring();
+ logger.info(response.getData());
+
+
+ logger.info("CustomBindingExampleResponse Spring:");
+ customBindingResponse = example.sendAndReceiveSpringCustom();
+ logger.info(customBindingResponse.getData());
}
}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<jaxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
- xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
- xmlns:annox="http://annox.dev.java.net"
- jaxb:version="2.1"
- jaxb:extensionBindingPrefixes="inheritance annox">
-
- <!--
- Se procesa con Xpath si quieres meter expresiones regulares y cosas asà en teorÃa dependes de Xpath
- por ejemplo esto: @name=match[.] se supone que deberÃa funcionar pero me dice que no puede
- cambiar mas de un nodo a la vez. Puede que sea un bug de xjc que se carga las opciones de Xpath :/
- <jaxb:bindings schemaLocation="examples.xsd">
- <jaxb:bindings node="//xsd:element[@name='ExampleRequest']/xsd:complexType">
- <inheritance:implements>de.spring.webservices.operations.Request</inheritance:implements>
- </jaxb:bindings>
- <jaxb:bindings node="//xsd:element[@name='ExampleResponse']/xsd:complexType">
- <inheritance:implements>de.spring.webservices.operations.Response</inheritance:implements>
- </jaxb:bindings>
- </jaxb:bindings>
- -->
-
- <!--
- <jaxb:bindings schemaLocation="../xsd/examples.xsd">
- <jaxb:bindings node="//xsd:element[@name='CustomBindingExampleRequest']/xsd:complexType">
- <inheritance:implements>de.spring.webservices.operations.Request</inheritance:implements>
- <annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
- </jaxb:bindings>
- </jaxb:bindings>
-
-
- <jaxb:bindings schemaLocation="../xsd/examples.xsd">
- <jaxb:bindings node="//xsd:element[@name='CustomBindingExampleResponse']/xsd:complexType">
- <inheritance:implements>de.spring.webservices.operations.Response</inheritance:implements>
- <annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
- </jaxb:bindings>
- </jaxb:bindings>
- -->
-
- <!-- The same applies to annotate. If you do not want or you may not modify your xsd files you can
- modify instead this file with your custom binding :) -->
-
-</jaxb:bindings>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:parent="http://gumartinm.name/spring-ws/parent"
+ xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
+ xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
+ xmlns:annox="http://annox.dev.java.net"
+ jaxb:version="2.1"
+ jaxb:extensionBindingPrefixes="inheritance annox"
+ elementFormDefault="qualified"
+ targetNamespace="http://gumartinm.name/spring-ws/example">
+
+ <!--
+ We are going to use catalog.cat in order to avoid downloading parent.xsd from remote server
+ -->
+ <xs:import namespace="http://gumartinm.name/spring-ws/parent" schemaLocation="http://gumartinm.name/spring-ws/parent/parent.xsd" />
+
+
+ <!-- Using inheritance and annox plugin -->
+ <xs:element name="ExampleRequest">
+ <xs:complexType>
+ <xs:annotation>
+ <xs:appinfo>
+ <annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
+ <inheritance:implements>de.spring.webservices.operations.Request</inheritance:implements>
+ </xs:appinfo>
+ </xs:annotation>
+ <xs:all>
+ <xs:element name="data" type="xs:string" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ExampleResponse">
+ <xs:complexType>
+ <xs:annotation>
+ <xs:appinfo>
+ <inheritance:implements>de.spring.webservices.operations.Response</inheritance:implements>
+ </xs:appinfo>
+ </xs:annotation>
+ <xs:all>
+ <xs:element name="data" type="xs:string" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+
+
+ <!-- Using custombinding.xjb instead of inheritance plugin.
+ Useful when you can not modify your xsd files because they are provided
+ by another person or company
+ -->
+ <xs:element name="CustomBindingExampleRequest">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="data" type="xs:string" />
+ <xs:element name="exampleDate" type="xs:dateTime" minOccurs="0" maxOccurs="1" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="CustomBindingExampleResponse">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="data" type="xs:string" />
+ <xs:element name="exampleDate" type="xs:dateTime" minOccurs="0" maxOccurs="1" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+
+
+</xs:schema>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="trace" strict="true"
+ name="XMLConfigTest" packages="org.apache.logging.log4j.test">
+ <Appenders>
+ <Appender type="Console" name="STDOUT">
+ <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
+ </Appender>
+ </Appenders>
+ <Loggers>
+ <Root level="trace">
+ <AppenderRef ref="STDOUT"/>
+ </Root>
+ </Loggers>
+</Configuration>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:sws="http://www.springframework.org/schema/web-services"
- xmlns:oxm="http://www.springframework.org/schema/oxm"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/web-services
- http://www.springframework.org/schema/web-services/web-services.xsd
- http://www.springframework.org/schema/oxm
- http://www.springframework.org/schema/oxm/spring-oxm.xsd">
-
- <!--
- This file is an example about how someone should write code in order to send and
- receive data from the Web Services.
- -->
-
- <!-- Searches for @Endpoint -->
- <context:component-scan base-package="de.spring.webservices"/>
-
- <oxm:jaxb2-marshaller id="marshaller" context-path="name.gumartinm.spring_ws.example"/>
-
- <!-- Searches for @PayloadRoot -->
- <sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller"/>
-
-
- <!-- Required in order to use SOAP 1.2
- id="messageFactory" is not a random choice, if you use another name it will not work
- (Spring will end up loading SOAP 1.1)
- -->
- <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
- <property name="soapVersion">
- <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" />
- </property>
- </bean>
-
-
- <sws:interceptors>
- <bean class="org.springframework.ws.soap.server.endpoint.interceptor.SoapEnvelopeLoggingInterceptor">
- <property name="logRequest" value="true"/>
- <property name="logResponse" value="true"/>
- </bean>
-
- <!--
- ¿Este validador funciona teniendo inheritance en el xsd? (inheritances es una cosa especial
- del JAXB2 que estoy usando para generar las clases desde el xsd)
- Parece que el unmarshal (que supongo que se hace con el JAXB2 que está en el classpath
- debido al tipo de Endpoint que estoy usando, que por cierto no sé cual JAXB2 está cogiendo realmente)
- funciona, asà que supongo el validador tambien :/
- Lo que realmente tampoco sé es si hay alguna relación entre los validadores y JAXB2 :/
- -->
- <bean id="validatingInterceptor"
- class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
- <property name="schema" value="classpath:xsd/examples.xsd"/>
- <property name="validateRequest" value="true"/>
- <property name="validateResponse" value="true"/>
- </bean>
- </sws:interceptors>
-
- <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
- <constructor-arg ref="messageFactory"/>
- <property name="marshaller" ref="marshaller" />
- <property name="unmarshaller" ref="marshaller" />
- <property name="defaultUri" value="http://gumartinm.name/spring-ws/example"/>
- <property name="interceptors">
- <list>
- <ref bean="payloadValidatingInterceptor" />
- </list>
- </property>
- </bean>
-
- <bean id="exampleClient" class="de.spring.webservices.client.ExampleClient">
- <property name="webServiceTemplate" ref="webServiceTemplate"/>
- </bean>
-
-</beans>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:sws="http://www.springframework.org/schema/web-services"
+ xmlns:oxm="http://www.springframework.org/schema/oxm"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:util="http://www.springframework.org/schema/util"
+
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/web-services
+ http://www.springframework.org/schema/web-services/web-services.xsd
+ http://www.springframework.org/schema/oxm
+ http://www.springframework.org/schema/oxm/spring-oxm.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util.xsd">
+
+ <!--
+ This file is an example about how someone should write code in order to send and
+ receive data from the Web Services.
+ -->
+
+ <!-- Searches for @Endpoint -->
+ <context:component-scan base-package="de.spring.webservices"/>
+
+ <oxm:jaxb2-marshaller id="marshaller" context-path="de.spring.webservices.auto"/>
+
+ <!-- Searches for @PayloadRoot -->
+ <sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller"/>
+
+
+ <!-- Required in order to use SOAP 1.2
+ id="messageFactory" is not a random choice, if you use another name it will not work
+ (Spring will end up loading SOAP 1.1)
+ -->
+ <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
+ <property name="soapVersion">
+ <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" />
+ </property>
+ </bean>
+
+
+ <sws:interceptors>
+ <bean class="org.springframework.ws.soap.server.endpoint.interceptor.SoapEnvelopeLoggingInterceptor">
+ <property name="logRequest" value="true"/>
+ <property name="logResponse" value="true"/>
+ </bean>
+ </sws:interceptors>
+
+ <!--
+ ¿Este validador funciona teniendo inheritance en el xsd? (inheritances es una cosa especial
+ del JAXB2 que estoy usando para generar las clases desde el xsd)
+ Parece que el unmarshal (que supongo que se hace con el JAXB2 que está en el classpath
+ debido al tipo de Endpoint que estoy usando, que por cierto no sé cual JAXB2 está cogiendo realmente)
+ funciona, asà que supongo el validador tambien :/
+ Lo que realmente tampoco sé es si hay alguna relación entre los validadores y JAXB2 :/
+ -->
+ <bean id="payloadValidatingInterceptor"
+ class="org.springframework.ws.client.support.interceptor.PayloadValidatingInterceptor">
+ <property name="schemas">
+ <list>
+ <value>classpath:examples.xsd</value>
+ <value>classpath:parent.xsd</value>
+ </list>
+ </property>
+ <property name="validateRequest" value="true"/>
+ <property name="validateResponse" value="true"/>
+ </bean>
+
+
+ <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
+ <constructor-arg ref="messageFactory"/>
+ <property name="marshaller" ref="marshaller" />
+ <property name="unmarshaller" ref="marshaller" />
+
+ <!-- For local deployments change to http://localhost:8080/web-services-spring-server/spring-ws/example -->
+ <property name="defaultUri" value="http://gumartinm.name/spring-ws/example"/>
+
+ <property name="interceptors">
+ <list>
+ <ref bean="payloadValidatingInterceptor" />
+ </list>
+ </property>
+ </bean>
+
+ <bean id="exampleClient" class="de.spring.webservices.client.ExampleClientService">
+ <!--
+ @Autowired works even using XML configuration as long as you use context:component-scan
+ <property name="webServiceTemplate" ref="webServiceTemplate"/>
+ -->
+ </bean>
+
+</beans>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="http://gumartinm.name/spring-ws/example" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://gumartinm.name/spring-ws/example" targetNamespace="http://gumartinm.name/spring-ws/example">
- <wsdl:types>
- <xs:schema xmlns:annox="http://annox.dev.java.net" xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" jaxb:extensionBindingPrefixes="inheritance annox" jaxb:version="2.1" targetNamespace="http://gumartinm.name/spring-ws/example">
-
-
- <!-- Using inheritance and annox plugin -->
- <xs:element name="ExampleRequest">
- <xs:complexType>
- <xs:annotation>
- <xs:appinfo>
- <annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
- <inheritance:implements>de.spring.webservices.operations.Request</inheritance:implements>
- </xs:appinfo>
- </xs:annotation>
- <xs:all>
- <xs:element name="data" type="xs:string"/>
- </xs:all>
- </xs:complexType>
- </xs:element>
- <xs:element name="ExampleResponse">
- <xs:complexType>
- <xs:annotation>
- <xs:appinfo>
- <inheritance:implements>de.spring.webservices.operations.Response</inheritance:implements>
- </xs:appinfo>
- </xs:annotation>
- <xs:all>
- <xs:element name="data" type="xs:string"/>
- </xs:all>
- </xs:complexType>
- </xs:element>
-
-
- <!-- Using custombinding.xjb instead of inheritance plugin.
- Useful when you can not modify your xsd files because they are provided
- by another person or company
- -->
- <xs:element name="CustomBindingExampleRequest">
- <xs:complexType>
- <xs:all>
- <xs:element name="data" type="xs:string"/>
- </xs:all>
- </xs:complexType>
- </xs:element>
- <xs:element name="CustomBindingExampleResponse">
- <xs:complexType>
- <xs:all>
- <xs:element name="data" type="xs:string"/>
- </xs:all>
- </xs:complexType>
- </xs:element>
-
-
-</xs:schema>
- </wsdl:types>
- <wsdl:message name="CustomBindingExampleRequest">
- <wsdl:part element="tns:CustomBindingExampleRequest" name="CustomBindingExampleRequest">
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="CustomBindingExampleResponse">
- <wsdl:part element="tns:CustomBindingExampleResponse" name="CustomBindingExampleResponse">
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="ExampleRequest">
- <wsdl:part element="tns:ExampleRequest" name="ExampleRequest">
- </wsdl:part>
- </wsdl:message>
- <wsdl:message name="ExampleResponse">
- <wsdl:part element="tns:ExampleResponse" name="ExampleResponse">
- </wsdl:part>
- </wsdl:message>
- <wsdl:portType name="Examples">
- <wsdl:operation name="CustomBindingExample">
- <wsdl:input message="tns:CustomBindingExampleRequest" name="CustomBindingExampleRequest">
- </wsdl:input>
- <wsdl:output message="tns:CustomBindingExampleResponse" name="CustomBindingExampleResponse">
- </wsdl:output>
- </wsdl:operation>
- <wsdl:operation name="Example">
- <wsdl:input message="tns:ExampleRequest" name="ExampleRequest">
- </wsdl:input>
- <wsdl:output message="tns:ExampleResponse" name="ExampleResponse">
- </wsdl:output>
- </wsdl:operation>
- </wsdl:portType>
- <wsdl:binding name="ExamplesSoap12" type="tns:Examples">
- <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
- <wsdl:operation name="CustomBindingExample">
- <soap12:operation soapAction=""/>
- <wsdl:input name="CustomBindingExampleRequest">
- <soap12:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="CustomBindingExampleResponse">
- <soap12:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- <wsdl:operation name="Example">
- <soap12:operation soapAction=""/>
- <wsdl:input name="ExampleRequest">
- <soap12:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="ExampleResponse">
- <soap12:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- </wsdl:binding>
- <wsdl:service name="ExamplesService">
- <wsdl:port binding="tns:ExamplesSoap12" name="ExamplesSoap12">
- <soap12:address location="http://localhost:8080/web-services-spring-server/spring-ws/example"/>
- </wsdl:port>
- </wsdl:service>
-</wsdl:definitions>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
- xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
- xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
- xmlns:annox="http://annox.dev.java.net"
- jaxb:version="2.1"
- jaxb:extensionBindingPrefixes="inheritance annox"
- elementFormDefault="qualified"
- targetNamespace="http://gumartinm.name/spring-ws/example">
-
-
- <!-- Using inheritance and annox plugin -->
- <xs:element name="ExampleRequest">
- <xs:complexType>
- <xs:annotation>
- <xs:appinfo>
- <annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
- <inheritance:implements>de.spring.webservices.operations.Request</inheritance:implements>
- </xs:appinfo>
- </xs:annotation>
- <xs:all>
- <xs:element name="data" type="xs:string" />
- </xs:all>
- </xs:complexType>
- </xs:element>
- <xs:element name="ExampleResponse">
- <xs:complexType>
- <xs:annotation>
- <xs:appinfo>
- <inheritance:implements>de.spring.webservices.operations.Response</inheritance:implements>
- </xs:appinfo>
- </xs:annotation>
- <xs:all>
- <xs:element name="data" type="xs:string" />
- </xs:all>
- </xs:complexType>
- </xs:element>
-
-
- <!-- Using custombinding.xjb instead of inheritance plugin.
- Useful when you can not modify your xsd files because they are provided
- by another person or company
- -->
- <xs:element name="CustomBindingExampleRequest">
- <xs:complexType>
- <xs:all>
- <xs:element name="data" type="xs:string" />
- </xs:all>
- </xs:complexType>
- </xs:element>
- <xs:element name="CustomBindingExampleResponse">
- <xs:complexType>
- <xs:all>
- <xs:element name="data" type="xs:string" />
- </xs:all>
- </xs:complexType>
- </xs:element>
-
-
-</xs:schema>
package de.spring.webservices.client;
+import static org.junit.Assert.assertEquals;
import static org.springframework.ws.test.client.RequestMatchers.payload;
import static org.springframework.ws.test.client.ResponseCreators.withPayload;
-import static org.junit.Assert.*;
import javax.xml.transform.Source;
-import name.gumartinm.spring_ws.example.ExampleResponse;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.ws.test.client.MockWebServiceServer;
import org.springframework.xml.transform.StringSource;
+import de.spring.webservices.auto.CustomBindingExampleResponse;
+import de.spring.webservices.auto.ExampleResponse;
+
@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("/client-spring-configuration.xml")
+@ContextConfiguration("classpath*:spring-configuration/ws/client-spring-configuration.xml")
public class ExampleClientServiceIntegrationTest {
@Autowired
mockServer.expect(payload(requestPayload)).andRespond(
withPayload(responsePayload));
- final ExampleResponse exampleResponse = exampleClientService.sendAndReceiveSpring();
+ final ExampleResponse response = exampleClientService.sendAndReceiveSpring();
- assertEquals(exampleResponse.getData(), "SNAKE EYES AND SCARLETT SPRING. IT IS CANON.");
+ assertEquals(response.getData(), "SNAKE EYES AND SCARLETT SPRING. IT IS CANON.");
+ mockServer.verify();
+ }
+
+ @Test
+ public void customerCustomClient() throws Exception {
+ final Source customRequestPayload = new StringSource(
+ "<CustomBindingExampleRequest xmlns='http://gumartinm.name/spring-ws/example'>" +
+ "<data>CUSTOM BINDING SPRING. SCARLETT. IT IS CANON.</data>" +
+ "</CustomBindingExampleRequest>");
+ final Source customResponsePayload = new StringSource(
+ "<ns2:CustomBindingExampleResponse xmlns:ns2='http://gumartinm.name/spring-ws/example'>" +
+ "<ns2:data>CUSTOM BINDING SNAKE EYES AND SCARLETT SPRING. IT IS CANON.</ns2:data>" +
+ "</ns2:CustomBindingExampleResponse>");
+ mockServer.expect(payload(customRequestPayload)).andRespond(
+ withPayload(customResponsePayload));
+ final CustomBindingExampleResponse response = exampleClientService.sendAndReceiveSpringCustom();
+
+ assertEquals(response.getData(), "CUSTOM BINDING SNAKE EYES AND SCARLETT SPRING. IT IS CANON.");
mockServer.verify();
}
}
--- /dev/null
+package de.spring.webservices.binders;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+
+/**
+ * ATTENTION: if you are using this custombinder you will have to create custom payload
+ * validators for Spring (AS FAR AS I KNOW)
+ *
+ */
+public class XSDateTimeCustomBinder extends XmlAdapter<String, Date> {
+
+ @Override
+ public Date unmarshal(final String dateTime) throws Exception {
+ // X pattern just works from Java >= 1.7
+ final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
+ formatter.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
+
+ return formatter.parse(dateTime);
+ }
+
+ @Override
+ public String marshal(final Date dateTime) throws Exception {
+ // X pattern just works from Java >= 1.7
+ final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
+ formatter.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
+
+ return formatter.format(dateTime);
+ }
+}
--- /dev/null
+package de.spring.webservices.operations;
+
+/**
+ * <p>
+ * Operations: WSDL v1.1 and v2.0
+ * </p>
+ * See: <a href="http://www.w3.org/TR/wsdl#_porttypes">http://www.w3.org/TR/wsdl#_porttypes</a><br>
+ * See: <a href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
+ * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
+ *
+ */
+public interface Operations {
+
+ /**
+ * <p>
+ * Request-response operation WSDL v1.1
+ * </p>
+ * See: <a
+ * href="http://www.w3.org/TR/wsdl#_request-response">http://www.w3.org
+ * /TR/wsdl#_request-response</a>
+ *
+ * @param <T>
+ * Describes {@link Response}
+ * @param <E>
+ * Describes {@link Request}
+ */
+ public static interface RequestResponse<T extends Response, E extends Request> {
+ T requestResponse(E request);
+ }
+
+ /**
+ * <p>
+ * One-way operation WSDL v1.1
+ * </p>
+ * See: <a
+ * href="http://www.w3.org/TR/wsdl#_one-way">http://www.w3.org/TR/wsdl
+ * #_one-way</a>
+ *
+ * @param <T>
+ * Describes {@link Response}
+ * @param <E>
+ * Describes {@link Request}
+ */
+ public interface OneWay<E extends Request> {
+ void oneWay(E request);
+ }
+
+ /**
+ * <p>
+ * Notification operation WSDL v1.1
+ * </p>
+ * See: <a
+ * href="http://www.w3.org/TR/wsdl#_notification">http://www.w3.org/TR
+ * /wsdl#_notification</a>
+ *
+ * @param <T>
+ * Describes {@link Response}
+ * @param <E>
+ * Describes {@link Request}
+ */
+ public interface Notification<T extends Response> {
+ T notification();
+ }
+
+ /**
+ * <p>
+ * In-Only message exchange pattern WSDL 2.0
+ * </p>
+ * See: <a
+ * href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
+ * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
+ *
+ * @param <E>
+ * Describes {@link Request}
+ */
+ public interface InOnly<E extends Request> {
+ void inOnly(E request);
+ }
+
+ /**
+ * <p>
+ * Robust In-Only message exchange pattern WSDL 2.0
+ * </p>
+ * See: <a
+ * href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
+ * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
+ *
+ * @param <E>
+ * Describes {@link Request}
+ */
+ public interface RobustInOnly<E extends Request> {
+ void robustInOnly(E request);
+ }
+
+ /**
+ * <p>
+ * In-Out message exchange pattern WSDL 2.0
+ * </p>
+ * See: <a
+ * href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
+ * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
+ *
+ * @param <T>
+ * Describes {@link Response}
+ * @param <E>
+ * Describes {@link Request}
+ */
+ public interface InOut<T extends Response, E extends Request> {
+ T inOut(E request);
+ }
+}
\ No newline at end of file
--- /dev/null
+package de.spring.webservices.operations;
+
+public interface Request {
+
+}
--- /dev/null
+package de.spring.webservices.operations;
+
+public interface Response {
+
+}
+++ /dev/null
-package de.spring.webservices.binders;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.TimeZone;
-
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-
-
-public class XSDateTimeCustomBinder extends XmlAdapter<String, Date> {
-
- @Override
- public Date unmarshal(final String dateTime) throws Exception {
- // X pattern just works from Java >= 1.7
- final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
- formatter.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
-
- return formatter.parse(dateTime);
- }
-
- @Override
- public String marshal(final Date dateTime) throws Exception {
- // X pattern just works from Java >= 1.7
- final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
- formatter.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));
-
- return formatter.format(dateTime);
- }
-}
+++ /dev/null
-package de.spring.webservices.operations;
-
-/**
- * <p>
- * Operations: WSDL v1.1 and v2.0
- * </p>
- * See: <a href="http://www.w3.org/TR/wsdl#_porttypes">http://www.w3.org/TR/wsdl#_porttypes</a><br>
- * See: <a href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
- * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
- *
- */
-public interface Operations {
-
- /**
- * <p>
- * Request-response operation WSDL v1.1
- * </p>
- * See: <a
- * href="http://www.w3.org/TR/wsdl#_request-response">http://www.w3.org
- * /TR/wsdl#_request-response</a>
- *
- * @param <T>
- * Describes {@link Response}
- * @param <E>
- * Describes {@link Request}
- */
- public static interface RequestResponse<T extends Response, E extends Request> {
- T requestResponse(E request);
- }
-
- /**
- * <p>
- * One-way operation WSDL v1.1
- * </p>
- * See: <a
- * href="http://www.w3.org/TR/wsdl#_one-way">http://www.w3.org/TR/wsdl
- * #_one-way</a>
- *
- * @param <T>
- * Describes {@link Response}
- * @param <E>
- * Describes {@link Request}
- */
- public interface OneWay<E extends Request> {
- void oneWay(E request);
- }
-
- /**
- * <p>
- * Notification operation WSDL v1.1
- * </p>
- * See: <a
- * href="http://www.w3.org/TR/wsdl#_notification">http://www.w3.org/TR
- * /wsdl#_notification</a>
- *
- * @param <T>
- * Describes {@link Response}
- * @param <E>
- * Describes {@link Request}
- */
- public interface Notification<T extends Response> {
- T notification();
- }
-
- /**
- * <p>
- * In-Only message exchange pattern WSDL 2.0
- * </p>
- * See: <a
- * href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
- * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
- *
- * @param <E>
- * Describes {@link Request}
- */
- public interface InOnly<E extends Request> {
- void inOnly(E request);
- }
-
- /**
- * <p>
- * Robust In-Only message exchange pattern WSDL 2.0
- * </p>
- * See: <a
- * href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
- * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
- *
- * @param <E>
- * Describes {@link Request}
- */
- public interface RobustInOnly<E extends Request> {
- void robustInOnly(E request);
- }
-
- /**
- * <p>
- * In-Out message exchange pattern WSDL 2.0
- * </p>
- * See: <a
- * href="http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns">
- * http://www.w3.org/TR/2007/REC-wsdl20-adjuncts-20070626/#patterns</a>
- *
- * @param <T>
- * Describes {@link Response}
- * @param <E>
- * Describes {@link Request}
- */
- public interface InOut<T extends Response, E extends Request> {
- T inOut(E request);
- }
-}
\ No newline at end of file
+++ /dev/null
-package de.spring.webservices.operations;
-
-public interface Request {
-
-}
+++ /dev/null
-package de.spring.webservices.operations;
-
-public interface Response {
-
-}
<xs:complexType>
<xs:all>
<xs:element name="data" type="xs:string" />
- <xs:element name="exampleDate" type="xs:dateTime" />
- <xs:element name="parentEnum" type="parent:parentEnumType" />
+ <xs:element name="exampleDate" type="xs:dateTime" minOccurs="0" maxOccurs="1" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:complexType>
<xs:all>
<xs:element name="data" type="xs:string" />
- <xs:element name="exampleDate" type="xs:dateTime" />
- <xs:element name="parentEnum" type="parent:parentEnumType" />
+ <xs:element name="exampleDate" type="xs:dateTime" minOccurs="0" maxOccurs="1" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
</xs:all>
</xs:complexType>
</xs:element>
<sws:dynamic-wsdl id="example" portTypeName="Examples"
createSoap12Binding="true" createSoap11Binding="false"
locationUri="/spring-ws/example"
- targetNamespace="http://gumartinm.name/spring-ws/example">
+ targetNamespace="http://gumartinm.name/resource/wsdl/schemas">
<sws:xsd location="classpath:examples.xsd"/>
</sws:dynamic-wsdl>