--- /dev/null
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>web-services-spring-cxf</artifactId>
+ <groupId>de.spring.webservices</groupId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>web-services-spring-cxf-client</artifactId>
+ <name>web-services-spring-cxf-client</name>
+ <url>http://gumartinm.name</url>
+
+ <properties>
+ <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/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>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-ws-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-xml</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jdom</groupId>
+ <artifactId>jdom</artifactId>
+ </dependency>
+
+
+ <!-- Global types -->
+ <dependency>
+ <groupId>de.spring.webservices</groupId>
+ <artifactId>web-services-spring-cxf-globalxsds</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+
+ <!-- Required by spring-ws-core -->
+ <dependency>
+ <groupId>wsdl4j</groupId>
+ <artifactId>wsdl4j</artifactId>
+ </dependency>
+
+ <!-- Required by jaxb2-basics as specified:
+ http://confluence.highsource.org/display/J2B/Using+JAXB2+Basics+Plugins+with+CXF
+ -->
+ <dependency>
+ <groupId>org.jvnet.jaxb2_commons</groupId>
+ <artifactId>jaxb2-basics-runtime</artifactId>
+ <version>0.9.4</version>
+ </dependency>
+
+ <!-- Unitary and integration tests -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-ws-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/resources/</directory>
+ <includes>
+ <include>**/*.*</include>
+ </includes>
+ </resource>
+ </resources>
+ <plugins>
+ <!-- Generate code from wsdl files:
+ We could use maven-jaxb2-plugin in order to generate Java classes from WSDL files but
+ this plugin seems more useful so, I keep using it. Besides, it is based on Apache CXF which
+ as well, uses jaxb.
+
+ See: http://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html
+ -->
+ <plugin>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-codegen-plugin</artifactId>
+ <version>3.1.0</version>
+ <executions>
+ <execution>
+ <id>generate-sources-from-wsdl</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>wsdl2java</goal>
+ </goals>
+ <configuration>
+ <fork>true</fork>
+ <sourceRoot>${project.wsdl.target.path}</sourceRoot>
+ <wsdlOptions>
+ <wsdlOption>
+ <!--
+ <wsdl>${project.wsdl.sources.path}/example.wsdl</wsdl>
+ -->
+ <wsdl>${project.wsdl.sources.path}/example.wsdl</wsdl>
+ <bindingFiles>
+ <bindingFile>${project.bindings.path}/custombinding.xjb</bindingFile>
+ </bindingFiles>
+ <extraargs>
+ <extraarg>-xjc-Xinheritance</extraarg>
+ <extraarg>-xjc-Xannotate</extraarg>
+ <extraarg>-catalog</extraarg>
+ <extraarg>${project.catalogs.path}/catalog.cat</extraarg>
+ <extraarg>-verbose</extraarg>
+ </extraargs>
+ </wsdlOption>
+ </wsdlOptions>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <!-- We make this plugin work with this jaxb2 version.
+ This particular version let us generate inherited classes using
+ the -Xinheritance argument.
+
+ DO NOT FORGET: We can use <inheritance:implements> in xsd files or by means
+ of custom bindings (see custombinding.xjb) This is useful when you may not modify
+ xsd files because they are generated by other person or machine.
+ -->
+ <dependency>
+ <groupId>org.jvnet.jaxb2_commons</groupId>
+ <artifactId>jaxb2-basics</artifactId>
+ <version>0.9.4</version>
+ </dependency>
+
+ <!-- We make this plugin work with this jaxb2 version.
+ This particular version let us generate annotated classes using
+ the -Xannotate argument.
+
+ DO NOT FORGET: We can use <annox:annotate> in xsd files or by means
+ of custom bindings like I did with <inheritance:implements> (see custombinding.xjb)
+ This is useful when you may not modify xsd files because they are generated
+ by other person or machine.
+ -->
+ <dependency>
+ <groupId>org.jvnet.jaxb2_commons</groupId>
+ <artifactId>jaxb2-basics-annotate</artifactId>
+ <version>1.0.1</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.9.1</version>
+ <executions>
+ <execution>
+ <id>add-source</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>add-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>${project.wsdl.target.path}</source>
+ </sources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+
--- /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"?>
+<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:example="http://gumartinm.name/spring-ws/example" 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>
+
+ <!-- Example of creating array list by means of XSD -->
+ <xs:complexType name="car">
+ <xs:sequence>
+ <xs:element name="data" type="xs:string"/>
+ <xs:element maxOccurs="100" minOccurs="0" name="parentEnum" type="parent:parentEnumType"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="truck">
+ <xs:all>
+ <xs:element name="data" type="xs:string"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="parentEnum" type="parent:parentEnumType"/>
+ </xs:all>
+ </xs:complexType>
+ <xs:element name="vehicles">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="cars" type="example:car"/>
+ <xs:element maxOccurs="100" minOccurs="0" name="trucks" type="example:truck"/>
+ </xs:sequence>
+ </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>
--- /dev/null
+package de.spring.webservices.client;
+
+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 {
+ private final WebServiceTemplate webServiceTemplate;
+
+ @Autowired
+ public ExampleClientService(WebServiceTemplate webServiceTemplate) {
+ this.webServiceTemplate = webServiceTemplate;
+ }
+
+ public ExampleResponse sendAndReceiveJava() {
+ final ExampleRequest exampleRequest = new ExampleRequest();
+ exampleRequest.setData("SCARLETT JAVA. IT IS CANON.");
+
+ final Examples exampleService = new ExamplesService().getExamplesSoap12();
+ final ExampleResponse exampleResponse = exampleService.example(exampleRequest);
+
+ return exampleResponse;
+ }
+
+ public ExampleResponse sendAndReceiveSpring() {
+ final ExampleRequest exampleRequest = new ExampleRequest();
+ exampleRequest.setData("SCARLETT SPRING. IT IS CANON.");
+
+ final ExampleResponse exampleResponse = (ExampleResponse)
+ this.webServiceTemplate.marshalSendAndReceive(exampleRequest);
+
+ return exampleResponse;
+ }
+
+ public CustomBindingExampleResponse sendAndReceiveJavaCustom() {
+ 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 =
+ exampleService.customBindingExample(customBindingxampleRequest);
+
+ return customBindingExampleResponse;
+ }
+
+ public CustomBindingExampleResponse sendAndReceiveSpringCustom() {
+ final CustomBindingExampleRequest customBindingxampleRequest =
+ new CustomBindingExampleRequest();
+ customBindingxampleRequest.setData("CUSTOM BINDING SPRING. SCARLETT. IT IS CANON.");
+
+ final CustomBindingExampleResponse customBindingExampleResponse =
+ (CustomBindingExampleResponse) this.webServiceTemplate
+ .marshalSendAndReceive(customBindingxampleRequest);
+
+ return customBindingExampleResponse;
+ }
+}
--- /dev/null
+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;
+
+ /**
+ * @param args
+ */
+ public static void main(final String[] args) {
+ final MainTest test = new MainTest();
+
+ test.context = new ClassPathXmlApplicationContext(
+ "classpath:spring-configuration/ws/client-spring-configuration.xml");
+
+ final ExampleClientService example =
+ (ExampleClientService) test.context.getBean("exampleClient");
+
+ 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" ?>
+<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"
+ xmlns:example="http://gumartinm.name/spring-ws/example"
+ 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>
+
+ <!-- Example of creating array list by means of XSD -->
+ <xs:complexType name="car">
+ <xs:sequence>
+ <xs:element name="data" type="xs:string" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="100" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="truck">
+ <xs:all>
+ <xs:element name="data" type="xs:string" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
+ </xs:all>
+ </xs:complexType>
+ <xs:element name="vehicles">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="cars" type="example:car" maxOccurs="unbounded" />
+ <xs:element name="trucks" type="example:truck" minOccurs="0" maxOccurs="100" />
+ </xs:sequence>
+ </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"
+ 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
+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 javax.xml.transform.Source;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.ws.client.core.WebServiceTemplate;
+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("classpath*:spring-configuration/ws/client-spring-configuration.xml")
+public class ExampleClientServiceIntegrationTest {
+
+ @Autowired
+ ExampleClientService exampleClientService;
+
+ @Autowired
+ private WebServiceTemplate webServiceTemplate;
+
+ private MockWebServiceServer mockServer;
+
+ @Before
+ public void createServer() throws Exception {
+ mockServer = MockWebServiceServer.createServer(webServiceTemplate);
+ }
+
+ @Test
+ public void customerClient() throws Exception {
+ final Source requestPayload = new StringSource(
+ "<ExampleRequest xmlns='http://gumartinm.name/spring-ws/example'>"
+ + "<data>SCARLETT SPRING. IT IS CANON.</data>"
+ + "</ExampleRequest>");
+ final Source responsePayload = new StringSource(
+ "<ns2:ExampleResponse xmlns:ns2='http://gumartinm.name/spring-ws/example'>"
+ + "<ns2:data>SNAKE EYES AND SCARLETT SPRING. IT IS CANON.</ns2:data>"
+ + "</ns2:ExampleResponse>");
+ mockServer.expect(payload(requestPayload)).andRespond(
+ withPayload(responsePayload));
+
+ final ExampleResponse response = exampleClientService.sendAndReceiveSpring();
+
+ 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
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>web-services-spring-cxf</artifactId>
+ <groupId>de.spring.webservices</groupId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>web-services-spring-cxf-globalxsds</artifactId>
+ <name>web-services-spring-cxf-globalxsds</name>
+ <url>http://gumartinm.name</url>
+
+ <properties>
+ <project.xsd.schemas.source.path>src/main/resources</project.xsd.schemas.source.path>
+ <project.xsd.schemas.target.path>${basedir}/target/generated-sources/src/main/java</project.xsd.schemas.target.path>
+ <project.xsd.schemas.package.name>de.spring.webservices.auto</project.xsd.schemas.package.name>
+ <project.bindings.path>src/main/build-resources/bindings</project.bindings.path>
+ </properties>
+
+ <dependencies>
+
+ <!-- Unitary and integration tests -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/resources</directory>
+ <includes>
+ <include>**/*.*</include>
+ </includes>
+ </resource>
+ </resources>
+ <plugins>
+ <!-- Generate code from xsd files:
+ We could use maven-jaxb2-plugin in order to generate Java classes from XSD files but
+ this plugin seems more useful so, I keep using it. Besides, it is based on Apache CXF which
+ as well, uses jaxb.
+
+ See: http://cxf.apache.org/cxf-xjc-plugin.html
+ -->
+ <plugin>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-xjc-plugin</artifactId>
+ <version>3.0.3</version>
+ <configuration>
+ <fork>true</fork>
+ <extensions>
+ <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:3.0.3</extension>
+ </extensions>
+ </configuration>
+ <executions>
+ <execution>
+ <id>generate-sources-from-xsd</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>xsdtojava</goal>
+ </goals>
+ <configuration>
+ <sourceRoot>${project.xsd.schemas.target.path}</sourceRoot>
+ <xsdOptions>
+ <xsdOption>
+ <extension>true</extension>
+ <xsd>${project.xsd.schemas.source.path}/parent.xsd</xsd>
+ <bindingFile>${project.bindings.path}/custombinding.xjb</bindingFile>
+ <packagename>${project.xsd.schemas.package.name}</packagename>
+ </xsdOption>
+ </xsdOptions>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.9.1</version>
+ <executions>
+ <execution>
+ <id>add-source</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>add-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>${project.xsd.schemas.target.path}</source>
+ </sources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
--- /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"
+ jaxb:version="2.1"
+ jaxb:extensionBindingPrefixes="">
+
+</jaxb:bindings>
--- /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
+<?xml version="1.0" encoding="UTF-8" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified"
+ targetNamespace="http://gumartinm.name/spring-ws/parent">
+
+ <xs:simpleType name="parentEnumType">
+ <xs:restriction base="xs:token">
+ <xs:enumeration value="FIRST"/>
+ <xs:enumeration value="SECOND"/>
+ <xs:enumeration value="THIRD"/>
+ <xs:enumeration value="FOURTH"/>
+ <xs:enumeration value="FIVETH"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema>
--- /dev/null
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>web-services-spring-cxf</artifactId>
+ <groupId>de.spring.webservices</groupId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>web-services-spring-cxf-server</artifactId>
+ <packaging>war</packaging>
+ <name>web-services-spring-cxf-server</name>
+ <url>http://gumartinm.name</url>
+
+ <properties>
+ <jetty.version>9.3.0.RC0</jetty.version>
+ <project.xsd.schemas.source.path>src/main/resources</project.xsd.schemas.source.path>
+ <project.xsd.schemas.target.path>${basedir}/target/generated-sources/src/main/java</project.xsd.schemas.target.path>
+ <project.xsd.schemas.package.name>de.spring.webservices.auto</project.xsd.schemas.package.name>
+ <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>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-ws-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-xml</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jdom</groupId>
+ <artifactId>jdom</artifactId>
+ </dependency>
+
+
+ <!-- Global types -->
+ <dependency>
+ <groupId>de.spring.webservices</groupId>
+ <artifactId>web-services-spring-cxf-globalxsds</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+
+ <!-- Required by spring-ws-core -->
+ <dependency>
+ <groupId>wsdl4j</groupId>
+ <artifactId>wsdl4j</artifactId>
+ </dependency>
+
+ <!-- Required by jaxb2-basics as specified:
+ http://confluence.highsource.org/display/J2B/Using+JAXB2+Basics+Plugins+with+CXF
+ -->
+ <dependency>
+ <groupId>org.jvnet.jaxb2_commons</groupId>
+ <artifactId>jaxb2-basics-runtime</artifactId>
+ <version>0.9.4</version>
+ </dependency>
+
+ <!-- Unitary and integration tests -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-ws-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/webapp</directory>
+ <excludes>
+ <exclude>**/*.*</exclude>
+ </excludes>
+ </resource>
+ <resource>
+ <directory>${basedir}/src/main/resources/</directory>
+ <includes>
+ <include>**/*.*</include>
+ </includes>
+ </resource>
+ </resources>
+ <plugins>
+ <!-- Generate code from xsd files:
+ We could use maven-jaxb2-plugin in order to generate Java classes from XSD files but
+ this plugin seems more useful so, I keep using it. Besides, it is based on Apache CXF which
+ as well, uses jaxb.
+
+ See: http://cxf.apache.org/cxf-xjc-plugin.html
+ -->
+ <plugin>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-xjc-plugin</artifactId>
+ <version>3.0.3</version>
+ <configuration>
+ <fork>true</fork>
+ <extensions>
+ <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:3.0.3</extension>
+ </extensions>
+ </configuration>
+ <executions>
+ <execution>
+ <id>generate-sources-from-xsd</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>xsdtojava</goal>
+ </goals>
+ <configuration>
+ <sourceRoot>${project.xsd.schemas.target.path}</sourceRoot>
+ <xsdOptions>
+ <xsdOption>
+ <extension>true</extension>
+ <xsd>${project.xsd.schemas.source.path}/examples.xsd</xsd>
+ <bindingFile>${project.bindings.path}/custombinding.xjb</bindingFile>
+ <catalog>${project.catalogs.path}/catalog.cat</catalog>
+ <packagename>${project.xsd.schemas.package.name}</packagename>
+ <extensionArgs>
+ <extraarg>-Xinheritance</extraarg>
+ <extraarg>-Xannotate</extraarg>
+ </extensionArgs>
+ </xsdOption>
+ </xsdOptions>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <!-- We make this plugin work with this jaxb2 version.
+ This particular version let us generate inherited classes using
+ the -Xinheritance argument.
+
+ DO NOT FORGET: We can use <inheritance:implements> in xsd files or by means
+ of custom bindings (see custombinding.xjb) This useful when you may not modify
+ xsd files because they are generated by other person or machine.
+ -->
+ <dependency>
+ <groupId>org.jvnet.jaxb2_commons</groupId>
+ <artifactId>jaxb2-basics</artifactId>
+ <version>0.9.4</version>
+ </dependency>
+
+ <!-- We make this plugin work with this jaxb2 version.
+ This particular version let us generate annotated classes using
+ the -Xannotate argument.
+
+ DO NOT FORGET: We can use <annox:annotate> in xsd files or by means
+ of custom bindings like I did with <inheritance:implements> (see custombinding.xjb)
+ This useful when you may not modify xsd files because they are generated
+ by other person or machine.
+ -->
+ <dependency>
+ <groupId>org.jvnet.jaxb2_commons</groupId>
+ <artifactId>jaxb2-basics-annotate</artifactId>
+ <version>1.0.1</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>1.9.1</version>
+ <executions>
+ <execution>
+ <id>add-source</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>add-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>${project.xsd.schemas.target.path}</source>
+ </sources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <webResources>
+ <resource>
+ <filtering>true</filtering>
+ <directory>src/main/webapp</directory>
+ <includes>
+ <include>WEB-INF/web.xml</include>
+ </includes>
+ </resource>
+ </webResources>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-maven-plugin</artifactId>
+ <version>${jetty.version}</version>
+ <configuration>
+ <jettyXml>${basedir}/src/main/jetty/jetty-http.xml</jettyXml>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
--- /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"
+ xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
+ jaxb:version="2.1"
+ jaxb:extensionBindingPrefixes="xjc 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="../../resources/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="../../resources/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 :) -->
+
+ <!-- Custom xs:dateTime adapter
+ See: https://jaxb.java.net/2.2.4/docs/vendorCustomizations.html#javaType
+ -->
+ <jaxb:globalBindings>
+ <xjc:javaType adapter="de.spring.webservices.binders.XSDateTimeCustomBinder"
+ name="java.util.Date" xmlType="xs:dateTime" />
+ </jaxb:globalBindings>
+
+</jaxb:bindings>
--- /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
+package de.spring.webservices.endpoints;
+
+import org.jdom2.Element;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ws.context.MessageContext;
+import org.springframework.ws.server.endpoint.annotation.Endpoint;
+import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
+import org.springframework.ws.server.endpoint.annotation.RequestPayload;
+import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
+
+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.operations.Operations;
+import de.spring.webservices.operations.Operations.RequestResponse;
+import de.spring.webservices.services.ExampleService;
+
+
+@Endpoint
+public class ExampleEndPoint {
+ private static final String NAMESPACE_URI = "http://gumartinm.name/spring-ws/example";
+
+ private final Operations.RequestResponse
+ <CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService;
+
+ private final ExampleService exampleService;
+
+ @Autowired
+ public ExampleEndPoint(
+ RequestResponse<CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService,
+ ExampleService exampleService) {
+ this.customBindingExampleService = customBindingExampleService;
+ this.exampleService = exampleService;
+ }
+
+ @PayloadRoot(localPart = "ExampleRequest", namespace = NAMESPACE_URI)
+ @ResponsePayload
+ public ExampleResponse exampleResponse(
+ @RequestPayload final ExampleRequest request,
+ @RequestPayload final Element element,
+ final MessageContext messageContext) {
+
+ return this.exampleService.doResponse(request);
+ }
+
+ @PayloadRoot(localPart = "CustomBindingExampleRequest", namespace = NAMESPACE_URI)
+ @ResponsePayload
+ public CustomBindingExampleResponse cuntomBindingExampleResponse(
+ @RequestPayload final CustomBindingExampleRequest requestObject,
+ @RequestPayload final Element element,
+ final MessageContext messageContext) {
+
+ return this.customBindingExampleService.requestResponse(requestObject);
+ }
+}
+
--- /dev/null
+package de.spring.webservices.services;
+
+import de.spring.webservices.auto.ExampleRequest;
+import de.spring.webservices.auto.ExampleResponse;
+
+
+public interface ExampleService {
+
+ public ExampleResponse doResponse(ExampleRequest request);
+
+}
--- /dev/null
+package de.spring.webservices.services.impl;
+
+import org.springframework.stereotype.Service;
+
+import de.spring.webservices.auto.CustomBindingExampleRequest;
+import de.spring.webservices.auto.CustomBindingExampleResponse;
+import de.spring.webservices.auto.ParentEnumType;
+import de.spring.webservices.operations.Operations;
+
+
+@Service("customBindingExampleService")
+public class CustomBindingExampleServiceImpl implements
+ Operations.RequestResponse<CustomBindingExampleResponse, CustomBindingExampleRequest> {
+
+
+ @Override
+ public CustomBindingExampleResponse requestResponse(final CustomBindingExampleRequest request) {
+
+ CustomBindingExampleResponse response = new CustomBindingExampleResponse();
+
+ response.setData("CUSTOM BINDING SNAKE EYES AND " + request.getData());
+ response.setParentEnum(ParentEnumType.FIRST);
+
+ return response;
+ }
+
+}
--- /dev/null
+package de.spring.webservices.services.impl;
+
+import org.springframework.stereotype.Service;
+
+import de.spring.webservices.auto.ExampleRequest;
+import de.spring.webservices.auto.ExampleResponse;
+import de.spring.webservices.services.ExampleService;
+
+
+@Service("exampleService")
+public class ExampleServiceImpl implements ExampleService {
+
+ @Override
+ public ExampleResponse doResponse(final ExampleRequest request) {
+
+ ExampleResponse response = new ExampleResponse();
+
+ response.setData("SNAKE EYES AND " + request.getData());
+
+ return response;
+ }
+
+}
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure the Jetty Server instance with an ID "Server" -->
+<!-- by adding a HTTP connector. -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+ <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+ <Set name="secureScheme">https</Set>
+ <Set name="securePort">
+ <Property name="jetty.secure.port" default="8443" />
+ </Set>
+ <Set name="outputBufferSize">32768</Set>
+ <Set name="requestHeaderSize">8192</Set>
+ <Set name="responseHeaderSize">8192</Set>
+ <Set name="sendServerVersion">true</Set>
+ <Set name="sendDateHeader">false</Set>
+ <Set name="headerCacheSize">512</Set>
+
+ <!-- Uncomment to enable handling of X-Forwarded- style headers
+ <Call name="addCustomizer">
+ <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
+ </Call>
+ -->
+ </New>
+
+
+ <!-- =========================================================== -->
+ <!-- Add a HTTP Connector. -->
+ <!-- Configure an o.e.j.server.ServerConnector with a single -->
+ <!-- HttpConnectionFactory instance using the common httpConfig -->
+ <!-- instance defined in jetty.xml -->
+ <!-- -->
+ <!-- Consult the javadoc of o.e.j.server.ServerConnector and -->
+ <!-- o.e.j.server.HttpConnectionFactory for all configuration -->
+ <!-- that may be set here. -->
+ <!-- =========================================================== -->
+ <Call name="addConnector">
+ <Arg>
+ <New class="org.eclipse.jetty.server.ServerConnector">
+ <Arg name="server">
+ <Ref refid="Server" />
+ </Arg>
+ <Arg name="factories">
+ <Array type="org.eclipse.jetty.server.ConnectionFactory">
+ <Item>
+ <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+ <Arg name="config">
+ <Ref refid="httpConfig" />
+ </Arg>
+ </New>
+ </Item>
+ </Array>
+ </Arg>
+ <Set name="host">
+ <Property name="jetty.host" default="127.0.0.1"/>
+ </Set>
+ <Set name="port">
+ <Property name="jetty.port" default="8080" />
+ </Set>
+ <Set name="idleTimeout">
+ <Property name="http.timeout" default="30000"/>
+ </Set>
+ </New>
+ </Arg>
+ </Call>
+
+</Configure>
--- /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"
+ xmlns:example="http://gumartinm.name/spring-ws/example"
+ 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>
+
+ <!-- Example of creating array list by means of XSD -->
+ <xs:complexType name="car">
+ <xs:sequence>
+ <xs:element name="data" type="xs:string" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="100" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="truck">
+ <xs:all>
+ <xs:element name="data" type="xs:string" />
+ <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
+ </xs:all>
+ </xs:complexType>
+ <xs:element name="vehicles">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="cars" type="example:car" maxOccurs="unbounded" />
+ <xs:element name="trucks" type="example:truck" minOccurs="0" maxOccurs="100" />
+ </xs:sequence>
+ </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: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/util
+ http://www.springframework.org/schema/util/spring-util.xsd">
+
+</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: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/web-services
+ http://www.springframework.org/schema/web-services/web-services.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util.xsd">
+
+ <!-- Searches for @Endpoint -->
+ <context:component-scan base-package="de.spring.webservices"/>
+
+ <!--
+ Aqui se podría especificar un unmarshaller (para la request) o un
+ marshaller (para la response) especifico. Por ejemplo Castor.
+
+ Por la anotacion que uso para el EndPoint y porque tengo JAXB2 en el
+ classpath, Spring lo que está haciendo es el equivalente a si se
+ escribiera lo siguiente:
+
+ <oxm:jaxb2-marshaller id="marshaller" context-path="de.spring.webservices.auto"/>
+
+ Searches for @PayloadRoot
+ <sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller"/>
+ -->
+ <sws:annotation-driven/>
+
+ <!--
+ Spring makes the WSDL file for us from the XSD file.
+ Launch the Jetty server and download WSDL file from this URL:
+ http://localhost:8080/web-services-spring-server/spring-ws/example/example.wsdl
+ -->
+ <sws:dynamic-wsdl id="example" portTypeName="Examples"
+ createSoap12Binding="true" createSoap11Binding="false"
+ locationUri="/spring-ws/example"
+ targetNamespace="http://gumartinm.name/resource/wsdl/schemas">
+ <sws:xsd location="classpath:examples.xsd"/>
+ </sws:dynamic-wsdl>
+
+
+ <bean id="parent" class="org.springframework.xml.xsd.SimpleXsdSchema">
+ <property name="xsd" value="classpath:parent.xsd"/>
+ </bean>
+
+
+ <!-- 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="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>
+ </sws:interceptors>
+
+
+ <bean id="exceptionResolver"
+ class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver">
+ <property name="defaultFault" value="SERVER"/>
+ <property name="exceptionMappings">
+ <value>
+ org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request
+ </value>
+ </property>
+ </bean>
+
+</beans>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
+ version="2.4">
+
+ <display-name>Spring Web Services: example</display-name>
+
+ <listener>
+ <listener-class>
+ org.springframework.web.context.ContextLoaderListener
+ </listener-class>
+ </listener>
+
+ <context-param>
+ <param-name>spring.profiles.active</param-name>
+ <param-value>${environment.profile}</param-value>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>
+ classpath*:spring-configuration/*.xml
+ </param-value>
+ </context-param>
+
+ <!-- Spring SOAP servlet -->
+ <servlet>
+ <servlet-name>spring-ws</servlet-name>
+ <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ <async-supported>true</async-supported>
+ <init-param>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>classpath*:spring-configuration/ws/*.xml</param-value>
+ </init-param>
+ <init-param>
+ <param-name>transformWsdlLocations</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>spring-ws</servlet-name>
+ <url-pattern>/spring-ws/*</url-pattern>
+ </servlet-mapping>
+
+</web-app>
--- /dev/null
+package de.spring.webservices.endpoints;
+
+import static org.springframework.ws.test.server.RequestCreators.withPayload;
+import static org.springframework.ws.test.server.ResponseMatchers.payload;
+
+import javax.xml.transform.Source;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.ws.test.server.MockWebServiceClient;
+import org.springframework.xml.transform.StringSource;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath*:spring-configuration/ws/soap-ws.xml" } )
+public class ExampleEndPointIntegrationTest {
+
+ @Autowired
+ private ApplicationContext applicationContext;
+
+ private MockWebServiceClient mockClient;
+
+ @Before
+ public void createClient() {
+ mockClient = MockWebServiceClient.createClient(applicationContext);
+ }
+
+ @Test
+ public void exampleEndpoint() throws Exception {
+ final Source requestPayload = new StringSource(
+ "<ExampleRequest xmlns='http://gumartinm.name/spring-ws/example'>" +
+ "<data>SCARLETT</data>" +
+ "</ExampleRequest>");
+ final Source responsePayload = new StringSource(
+ "<ns2:ExampleResponse xmlns:ns2='http://gumartinm.name/spring-ws/example'>" +
+ "<ns2:data>SNAKE EYES AND SCARLETT</ns2:data>" +
+ "</ns2:ExampleResponse>");
+ mockClient.sendRequest(withPayload(requestPayload)).andExpect(
+ payload(responsePayload));
+
+
+ final Source customRequestPayload = new StringSource(
+ "<CustomBindingExampleRequest xmlns='http://gumartinm.name/spring-ws/example'>" +
+ "<data>SCARLETT</data>" +
+ "<exampleDate>2015-06-03T10:20:30Z</exampleDate>" +
+ "<parentEnum>FIRST</parentEnum>" +
+ "</CustomBindingExampleRequest>");
+ final Source customResponsePayload = new StringSource(
+ "<ns2:CustomBindingExampleResponse xmlns:ns2='http://gumartinm.name/spring-ws/example'>" +
+ "<ns2:data>CUSTOM BINDING SNAKE EYES AND SCARLETT</ns2:data>" +
+ "<ns2:parentEnum>FIRST</ns2:parentEnum>" +
+ "</ns2:CustomBindingExampleResponse>");
+ mockClient.sendRequest(withPayload(customRequestPayload)).andExpect(
+ payload(customResponsePayload));
+ }
+}
+
--- /dev/null
+package de.spring.webservices.endpoints;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import de.spring.webservices.auto.CustomBindingExampleRequest;
+import de.spring.webservices.auto.CustomBindingExampleResponse;
+import de.spring.webservices.auto.ExampleRequest;
+import de.spring.webservices.operations.Operations;
+import de.spring.webservices.services.ExampleService;
+
+
+public class ExampleEndPointTest {
+
+ private ExampleService exampleService;
+
+ private Operations.RequestResponse
+ <CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService;
+
+ private ExampleEndPoint exampleEndPoint;
+
+ @Before
+ public void init() {
+ exampleService = mock(ExampleService.class);
+ customBindingExampleService = mock(Operations.RequestResponse.class);
+ exampleEndPoint = new ExampleEndPoint(customBindingExampleService, exampleService);
+ }
+
+ @Test
+ public void givenExampleRequestThenInvokeExampleService() {
+ ExampleRequest request = new ExampleRequest();
+ request.setData("SCARLETT");
+
+ exampleEndPoint.exampleResponse(request, null, null);
+
+ verify(exampleService).doResponse(request);
+ }
+
+ @Test
+ public void givenCustomBindingExampleRequestThenInvokeCustomBindingExampleService() {
+ CustomBindingExampleRequest request = new CustomBindingExampleRequest();
+ request.setData("SCARLETT");
+
+ exampleEndPoint.cuntomBindingExampleResponse(request, null, null);
+
+ verify(customBindingExampleService).requestResponse(request);
+ }
+
+}
--- /dev/null
+package de.spring.webservices.services;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import de.spring.webservices.auto.CustomBindingExampleRequest;
+import de.spring.webservices.auto.CustomBindingExampleResponse;
+import de.spring.webservices.operations.Operations;
+import de.spring.webservices.services.impl.CustomBindingExampleServiceImpl;
+
+
+public class CustomBindingExampleServiceTest {
+
+ private Operations.RequestResponse
+ <CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService;
+
+ @Before
+ public void init() {
+ customBindingExampleService = new CustomBindingExampleServiceImpl();
+ }
+
+ @Test
+ public void givenCustomBindingExampleRequestThenReturnCustomBindingExampleResponse() {
+ CustomBindingExampleRequest request = new CustomBindingExampleRequest();
+ request.setData("SCARLETT");
+ CustomBindingExampleResponse expected = new CustomBindingExampleResponse();
+ expected.setData("CUSTOM BINDING SNAKE EYES AND " + request.getData());
+
+ CustomBindingExampleResponse actual = customBindingExampleService.requestResponse(request);
+
+ Assert.assertEquals(expected.getData(), actual.getData());
+ }
+}
--- /dev/null
+package de.spring.webservices.services;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import de.spring.webservices.auto.ExampleRequest;
+import de.spring.webservices.auto.ExampleResponse;
+import de.spring.webservices.services.impl.ExampleServiceImpl;
+
+public class ExampleServiceTest {
+
+ private ExampleService exampleService;
+
+ @Before
+ public void init() {
+ exampleService = new ExampleServiceImpl();
+ }
+
+ @Test
+ public void givenExampleRequestThenReturnExampleResponse() {
+ ExampleRequest request = new ExampleRequest();
+ request.setData("SCARLETT");
+ ExampleResponse expected = new ExampleResponse();
+ expected.setData("SNAKE EYES AND " + request.getData());
+
+ ExampleResponse actual = exampleService.doResponse(request);
+
+ Assert.assertEquals(expected.getData(), actual.getData());
+ }
+
+}
--- /dev/null
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>de.spring.webservices</groupId>
+ <artifactId>web-services-spring-cxf</artifactId>
+ <packaging>pom</packaging>
+ <version>1.0-SNAPSHOT</version>
+ <name>web-services-spring-cxf</name>
+ <url>http://gumartinm.name</url>
+ <description>Web Services Spring Framework</description>
+ <organization>
+ <name>Gustavo Martin Morcuende</name>
+ <url>http://www.gumartinm.name</url>
+ </organization>
+ <scm>
+ <developerConnection>scm:git:http://git.gumartinm.name/SpringWebServicesForFun</developerConnection>
+ <url>http://git.gumartinm.name/SpringWebServicesForFun</url>
+ </scm>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <!-- Be aware: spring-ws latest version does not follow spring-context latest version -->
+ <spring.version>4.0.9.RELEASE</spring.version>
+ <spring.ws.version>2.2.1.RELEASE</spring.ws.version>
+ </properties>
+
+ <profiles>
+ <profile>
+ <id>release</id>
+ <properties>
+ <environment.profile>release</environment.profile>
+ </properties>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ </profile>
+ </profiles>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-slf4j-impl</artifactId>
+ <version>2.3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>2.3</version>
+ </dependency>
+ <dependency>
+ <groupId>cglib</groupId>
+ <artifactId>cglib</artifactId>
+ <version>2.2.2</version>
+ </dependency>
+ </dependencies>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-ws-core</artifactId>
+ <version>${spring.ws.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-xml</artifactId>
+ <version>${spring.ws.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jdom</groupId>
+ <artifactId>jdom</artifactId>
+ <version>2.0.2</version>
+ </dependency>
+
+ <!-- Required by spring-ws-core -->
+ <dependency>
+ <groupId>wsdl4j</groupId>
+ <artifactId>wsdl4j</artifactId>
+ <version>1.6.3</version>
+ </dependency>
+
+ <!-- Unitary and integration tests -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <version>${spring.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.ws</groupId>
+ <artifactId>spring-ws-test</artifactId>
+ <version>${spring.ws.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>2.0.11-beta</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <build>
+
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.18.1</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <version>2.18.1</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.3</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ <encoding>${project.build.sourceEncoding}</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.7</version>
+ <configuration>
+ <encoding>${project.build.sourceEncoding}</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <archive>
+ <manifestEntries>
+ <Specification-Title>${project.description}</Specification-Title>
+ <Specification-Version>${project.version}</Specification-Version>
+ <Specification-Vendor>${project.organization.name}</Specification-Vendor>
+ <Implementation-Title>${project.description}</Implementation-Title>
+ <Implementation-Version>${project.version}</Implementation-Version>
+ <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>**/*IntegrationTest.java</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-failsafe-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <includes>
+ <include>**/*IntegrationTest.java</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+++ /dev/null
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>web-services-spring</artifactId>
- <groupId>de.spring.webservices</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <artifactId>web-services-spring-client</artifactId>
- <name>web-services-spring-client</name>
- <url>http://gumartinm.name</url>
-
- <properties>
- <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/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>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-ws-core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-xml</artifactId>
- </dependency>
- <dependency>
- <groupId>org.jdom</groupId>
- <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>
- <artifactId>wsdl4j</artifactId>
- </dependency>
-
- <!-- Required by jaxb2-basics as specified:
- http://confluence.highsource.org/display/J2B/Using+JAXB2+Basics+Plugins+with+CXF
- -->
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>jaxb2-basics-runtime</artifactId>
- <version>0.9.4</version>
- </dependency>
-
- <!-- Unitary and integration tests -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-ws-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <finalName>${project.artifactId}</finalName>
- <resources>
- <resource>
- <directory>${basedir}/src/main/resources/</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </resource>
- </resources>
- <plugins>
- <!-- Generate code from wsdl files:
- We could use maven-jaxb2-plugin in order to generate Java classes from WSDL files but
- this plugin seems more useful so, I keep using it. Besides, it is based on Apache CXF which
- as well, uses jaxb.
-
- See: http://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html
- -->
- <plugin>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-codegen-plugin</artifactId>
- <version>3.1.0</version>
- <executions>
- <execution>
- <id>generate-sources-from-wsdl</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>wsdl2java</goal>
- </goals>
- <configuration>
- <fork>true</fork>
- <sourceRoot>${project.wsdl.target.path}</sourceRoot>
- <wsdlOptions>
- <wsdlOption>
- <!--
- <wsdl>${project.wsdl.sources.path}/example.wsdl</wsdl>
- -->
- <wsdl>${project.wsdl.sources.path}/example.wsdl</wsdl>
- <bindingFiles>
- <bindingFile>${project.bindings.path}/custombinding.xjb</bindingFile>
- </bindingFiles>
- <extraargs>
- <extraarg>-xjc-Xinheritance</extraarg>
- <extraarg>-xjc-Xannotate</extraarg>
- <extraarg>-catalog</extraarg>
- <extraarg>${project.catalogs.path}/catalog.cat</extraarg>
- <extraarg>-verbose</extraarg>
- </extraargs>
- </wsdlOption>
- </wsdlOptions>
- </configuration>
- </execution>
- </executions>
- <dependencies>
- <!-- We make this plugin work with this jaxb2 version.
- This particular version let us generate inherited classes using
- the -Xinheritance argument.
-
- DO NOT FORGET: We can use <inheritance:implements> in xsd files or by means
- of custom bindings (see custombinding.xjb) This is useful when you may not modify
- xsd files because they are generated by other person or machine.
- -->
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>jaxb2-basics</artifactId>
- <version>0.9.4</version>
- </dependency>
-
- <!-- We make this plugin work with this jaxb2 version.
- This particular version let us generate annotated classes using
- the -Xannotate argument.
-
- DO NOT FORGET: We can use <annox:annotate> in xsd files or by means
- of custom bindings like I did with <inheritance:implements> (see custombinding.xjb)
- This is useful when you may not modify xsd files because they are generated
- by other person or machine.
- -->
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>jaxb2-basics-annotate</artifactId>
- <version>1.0.1</version>
- </dependency>
- </dependencies>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>1.9.1</version>
- <executions>
- <execution>
- <id>add-source</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>${project.wsdl.target.path}</source>
- </sources>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-</project>
-
+++ /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"?>
-<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:example="http://gumartinm.name/spring-ws/example" 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>
-
- <!-- Example of creating array list by means of XSD -->
- <xs:complexType name="car">
- <xs:sequence>
- <xs:element name="data" type="xs:string"/>
- <xs:element maxOccurs="100" minOccurs="0" name="parentEnum" type="parent:parentEnumType"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="truck">
- <xs:all>
- <xs:element name="data" type="xs:string"/>
- <xs:element maxOccurs="1" minOccurs="0" name="parentEnum" type="parent:parentEnumType"/>
- </xs:all>
- </xs:complexType>
- <xs:element name="vehicles">
- <xs:complexType>
- <xs:sequence>
- <xs:element maxOccurs="unbounded" name="cars" type="example:car"/>
- <xs:element maxOccurs="100" minOccurs="0" name="trucks" type="example:truck"/>
- </xs:sequence>
- </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>
+++ /dev/null
-package de.spring.webservices.client;
-
-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 {
- private final WebServiceTemplate webServiceTemplate;
-
- @Autowired
- public ExampleClientService(WebServiceTemplate webServiceTemplate) {
- this.webServiceTemplate = webServiceTemplate;
- }
-
- public ExampleResponse sendAndReceiveJava() {
- final ExampleRequest exampleRequest = new ExampleRequest();
- exampleRequest.setData("SCARLETT JAVA. IT IS CANON.");
-
- final Examples exampleService = new ExamplesService().getExamplesSoap12();
- final ExampleResponse exampleResponse = exampleService.example(exampleRequest);
-
- return exampleResponse;
- }
-
- public ExampleResponse sendAndReceiveSpring() {
- final ExampleRequest exampleRequest = new ExampleRequest();
- exampleRequest.setData("SCARLETT SPRING. IT IS CANON.");
-
- final ExampleResponse exampleResponse = (ExampleResponse)
- this.webServiceTemplate.marshalSendAndReceive(exampleRequest);
-
- return exampleResponse;
- }
-
- public CustomBindingExampleResponse sendAndReceiveJavaCustom() {
- 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 =
- exampleService.customBindingExample(customBindingxampleRequest);
-
- return customBindingExampleResponse;
- }
-
- public CustomBindingExampleResponse sendAndReceiveSpringCustom() {
- final CustomBindingExampleRequest customBindingxampleRequest =
- new CustomBindingExampleRequest();
- customBindingxampleRequest.setData("CUSTOM BINDING SPRING. SCARLETT. IT IS CANON.");
-
- final CustomBindingExampleResponse customBindingExampleResponse =
- (CustomBindingExampleResponse) this.webServiceTemplate
- .marshalSendAndReceive(customBindingxampleRequest);
-
- return customBindingExampleResponse;
- }
-}
+++ /dev/null
-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;
-
- /**
- * @param args
- */
- public static void main(final String[] args) {
- final MainTest test = new MainTest();
-
- test.context = new ClassPathXmlApplicationContext(
- "classpath:spring-configuration/ws/client-spring-configuration.xml");
-
- final ExampleClientService example =
- (ExampleClientService) test.context.getBean("exampleClient");
-
- 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" ?>
-<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"
- xmlns:example="http://gumartinm.name/spring-ws/example"
- 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>
-
- <!-- Example of creating array list by means of XSD -->
- <xs:complexType name="car">
- <xs:sequence>
- <xs:element name="data" type="xs:string" />
- <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="100" />
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="truck">
- <xs:all>
- <xs:element name="data" type="xs:string" />
- <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
- </xs:all>
- </xs:complexType>
- <xs:element name="vehicles">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="cars" type="example:car" maxOccurs="unbounded" />
- <xs:element name="trucks" type="example:truck" minOccurs="0" maxOccurs="100" />
- </xs:sequence>
- </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"
- 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
-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 javax.xml.transform.Source;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.ws.client.core.WebServiceTemplate;
-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("classpath*:spring-configuration/ws/client-spring-configuration.xml")
-public class ExampleClientServiceIntegrationTest {
-
- @Autowired
- ExampleClientService exampleClientService;
-
- @Autowired
- private WebServiceTemplate webServiceTemplate;
-
- private MockWebServiceServer mockServer;
-
- @Before
- public void createServer() throws Exception {
- mockServer = MockWebServiceServer.createServer(webServiceTemplate);
- }
-
- @Test
- public void customerClient() throws Exception {
- final Source requestPayload = new StringSource(
- "<ExampleRequest xmlns='http://gumartinm.name/spring-ws/example'>"
- + "<data>SCARLETT SPRING. IT IS CANON.</data>"
- + "</ExampleRequest>");
- final Source responsePayload = new StringSource(
- "<ns2:ExampleResponse xmlns:ns2='http://gumartinm.name/spring-ws/example'>"
- + "<ns2:data>SNAKE EYES AND SCARLETT SPRING. IT IS CANON.</ns2:data>"
- + "</ns2:ExampleResponse>");
- mockServer.expect(payload(requestPayload)).andRespond(
- withPayload(responsePayload));
-
- final ExampleResponse response = exampleClientService.sendAndReceiveSpring();
-
- 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
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>web-services-spring</artifactId>
- <groupId>de.spring.webservices</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <artifactId>web-services-spring-globalxsds</artifactId>
- <name>web-services-spring-globalxsds</name>
- <url>http://gumartinm.name</url>
-
- <properties>
- <project.xsd.schemas.source.path>src/main/resources</project.xsd.schemas.source.path>
- <project.xsd.schemas.target.path>${basedir}/target/generated-sources/src/main/java</project.xsd.schemas.target.path>
- <project.xsd.schemas.package.name>de.spring.webservices.auto</project.xsd.schemas.package.name>
- <project.bindings.path>src/main/build-resources/bindings</project.bindings.path>
- </properties>
-
- <dependencies>
-
- <!-- Unitary and integration tests -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <finalName>${project.artifactId}</finalName>
- <resources>
- <resource>
- <directory>${basedir}/src/main/resources</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </resource>
- </resources>
- <plugins>
- <!-- Generate code from xsd files:
- We could use maven-jaxb2-plugin in order to generate Java classes from XSD files but
- this plugin seems more useful so, I keep using it. Besides, it is based on Apache CXF which
- as well, uses jaxb.
-
- See: http://cxf.apache.org/cxf-xjc-plugin.html
- -->
- <plugin>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-xjc-plugin</artifactId>
- <version>3.0.3</version>
- <configuration>
- <fork>true</fork>
- <extensions>
- <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:3.0.3</extension>
- </extensions>
- </configuration>
- <executions>
- <execution>
- <id>generate-sources-from-xsd</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>xsdtojava</goal>
- </goals>
- <configuration>
- <sourceRoot>${project.xsd.schemas.target.path}</sourceRoot>
- <xsdOptions>
- <xsdOption>
- <extension>true</extension>
- <xsd>${project.xsd.schemas.source.path}/parent.xsd</xsd>
- <bindingFile>${project.bindings.path}/custombinding.xjb</bindingFile>
- <packagename>${project.xsd.schemas.package.name}</packagename>
- </xsdOption>
- </xsdOptions>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>1.9.1</version>
- <executions>
- <execution>
- <id>add-source</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>${project.xsd.schemas.target.path}</source>
- </sources>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-</project>
+++ /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"
- jaxb:version="2.1"
- jaxb:extensionBindingPrefixes="">
-
-</jaxb:bindings>
+++ /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
-<?xml version="1.0" encoding="UTF-8" ?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
- elementFormDefault="qualified"
- targetNamespace="http://gumartinm.name/spring-ws/parent">
-
- <xs:simpleType name="parentEnumType">
- <xs:restriction base="xs:token">
- <xs:enumeration value="FIRST"/>
- <xs:enumeration value="SECOND"/>
- <xs:enumeration value="THIRD"/>
- <xs:enumeration value="FOURTH"/>
- <xs:enumeration value="FIVETH"/>
- </xs:restriction>
- </xs:simpleType>
-
-</xs:schema>
+++ /dev/null
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>web-services-spring</artifactId>
- <groupId>de.spring.webservices</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <artifactId>web-services-spring-server</artifactId>
- <packaging>war</packaging>
- <name>web-services-spring-server</name>
- <url>http://gumartinm.name</url>
-
- <properties>
- <jetty.version>9.3.0.RC0</jetty.version>
- <project.xsd.schemas.source.path>src/main/resources</project.xsd.schemas.source.path>
- <project.xsd.schemas.target.path>${basedir}/target/generated-sources/src/main/java</project.xsd.schemas.target.path>
- <project.xsd.schemas.package.name>de.spring.webservices.auto</project.xsd.schemas.package.name>
- <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>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-ws-core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-xml</artifactId>
- </dependency>
- <dependency>
- <groupId>org.jdom</groupId>
- <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>
- <artifactId>wsdl4j</artifactId>
- </dependency>
-
- <!-- Required by jaxb2-basics as specified:
- http://confluence.highsource.org/display/J2B/Using+JAXB2+Basics+Plugins+with+CXF
- -->
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>jaxb2-basics-runtime</artifactId>
- <version>0.9.4</version>
- </dependency>
-
- <!-- Unitary and integration tests -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-ws-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <finalName>${project.artifactId}</finalName>
- <resources>
- <resource>
- <directory>${basedir}/src/main/webapp</directory>
- <excludes>
- <exclude>**/*.*</exclude>
- </excludes>
- </resource>
- <resource>
- <directory>${basedir}/src/main/resources/</directory>
- <includes>
- <include>**/*.*</include>
- </includes>
- </resource>
- </resources>
- <plugins>
- <!-- Generate code from xsd files:
- We could use maven-jaxb2-plugin in order to generate Java classes from XSD files but
- this plugin seems more useful so, I keep using it. Besides, it is based on Apache CXF which
- as well, uses jaxb.
-
- See: http://cxf.apache.org/cxf-xjc-plugin.html
- -->
- <plugin>
- <groupId>org.apache.cxf</groupId>
- <artifactId>cxf-xjc-plugin</artifactId>
- <version>3.0.3</version>
- <configuration>
- <fork>true</fork>
- <extensions>
- <extension>org.apache.cxf.xjcplugins:cxf-xjc-dv:3.0.3</extension>
- </extensions>
- </configuration>
- <executions>
- <execution>
- <id>generate-sources-from-xsd</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>xsdtojava</goal>
- </goals>
- <configuration>
- <sourceRoot>${project.xsd.schemas.target.path}</sourceRoot>
- <xsdOptions>
- <xsdOption>
- <extension>true</extension>
- <xsd>${project.xsd.schemas.source.path}/examples.xsd</xsd>
- <bindingFile>${project.bindings.path}/custombinding.xjb</bindingFile>
- <catalog>${project.catalogs.path}/catalog.cat</catalog>
- <packagename>${project.xsd.schemas.package.name}</packagename>
- <extensionArgs>
- <extraarg>-Xinheritance</extraarg>
- <extraarg>-Xannotate</extraarg>
- </extensionArgs>
- </xsdOption>
- </xsdOptions>
- </configuration>
- </execution>
- </executions>
- <dependencies>
- <!-- We make this plugin work with this jaxb2 version.
- This particular version let us generate inherited classes using
- the -Xinheritance argument.
-
- DO NOT FORGET: We can use <inheritance:implements> in xsd files or by means
- of custom bindings (see custombinding.xjb) This useful when you may not modify
- xsd files because they are generated by other person or machine.
- -->
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>jaxb2-basics</artifactId>
- <version>0.9.4</version>
- </dependency>
-
- <!-- We make this plugin work with this jaxb2 version.
- This particular version let us generate annotated classes using
- the -Xannotate argument.
-
- DO NOT FORGET: We can use <annox:annotate> in xsd files or by means
- of custom bindings like I did with <inheritance:implements> (see custombinding.xjb)
- This useful when you may not modify xsd files because they are generated
- by other person or machine.
- -->
- <dependency>
- <groupId>org.jvnet.jaxb2_commons</groupId>
- <artifactId>jaxb2-basics-annotate</artifactId>
- <version>1.0.1</version>
- </dependency>
- </dependencies>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>build-helper-maven-plugin</artifactId>
- <version>1.9.1</version>
- <executions>
- <execution>
- <id>add-source</id>
- <phase>generate-sources</phase>
- <goals>
- <goal>add-source</goal>
- </goals>
- <configuration>
- <sources>
- <source>${project.xsd.schemas.target.path}</source>
- </sources>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.6</version>
- <configuration>
- <webResources>
- <resource>
- <filtering>true</filtering>
- <directory>src/main/webapp</directory>
- <includes>
- <include>WEB-INF/web.xml</include>
- </includes>
- </resource>
- </webResources>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- <version>${jetty.version}</version>
- <configuration>
- <jettyXml>${basedir}/src/main/jetty/jetty-http.xml</jettyXml>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
+++ /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"
- xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
- jaxb:version="2.1"
- jaxb:extensionBindingPrefixes="xjc 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="../../resources/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="../../resources/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 :) -->
-
- <!-- Custom xs:dateTime adapter
- See: https://jaxb.java.net/2.2.4/docs/vendorCustomizations.html#javaType
- -->
- <jaxb:globalBindings>
- <xjc:javaType adapter="de.spring.webservices.binders.XSDateTimeCustomBinder"
- name="java.util.Date" xmlType="xs:dateTime" />
- </jaxb:globalBindings>
-
-</jaxb:bindings>
+++ /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
-package de.spring.webservices.endpoints;
-
-import org.jdom2.Element;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.ws.context.MessageContext;
-import org.springframework.ws.server.endpoint.annotation.Endpoint;
-import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
-import org.springframework.ws.server.endpoint.annotation.RequestPayload;
-import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
-
-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.operations.Operations;
-import de.spring.webservices.operations.Operations.RequestResponse;
-import de.spring.webservices.services.ExampleService;
-
-
-@Endpoint
-public class ExampleEndPoint {
- private static final String NAMESPACE_URI = "http://gumartinm.name/spring-ws/example";
-
- private final Operations.RequestResponse
- <CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService;
-
- private final ExampleService exampleService;
-
- @Autowired
- public ExampleEndPoint(
- RequestResponse<CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService,
- ExampleService exampleService) {
- this.customBindingExampleService = customBindingExampleService;
- this.exampleService = exampleService;
- }
-
- @PayloadRoot(localPart = "ExampleRequest", namespace = NAMESPACE_URI)
- @ResponsePayload
- public ExampleResponse exampleResponse(
- @RequestPayload final ExampleRequest request,
- @RequestPayload final Element element,
- final MessageContext messageContext) {
-
- return this.exampleService.doResponse(request);
- }
-
- @PayloadRoot(localPart = "CustomBindingExampleRequest", namespace = NAMESPACE_URI)
- @ResponsePayload
- public CustomBindingExampleResponse cuntomBindingExampleResponse(
- @RequestPayload final CustomBindingExampleRequest requestObject,
- @RequestPayload final Element element,
- final MessageContext messageContext) {
-
- return this.customBindingExampleService.requestResponse(requestObject);
- }
-}
-
+++ /dev/null
-package de.spring.webservices.services;
-
-import de.spring.webservices.auto.ExampleRequest;
-import de.spring.webservices.auto.ExampleResponse;
-
-
-public interface ExampleService {
-
- public ExampleResponse doResponse(ExampleRequest request);
-
-}
+++ /dev/null
-package de.spring.webservices.services.impl;
-
-import org.springframework.stereotype.Service;
-
-import de.spring.webservices.auto.CustomBindingExampleRequest;
-import de.spring.webservices.auto.CustomBindingExampleResponse;
-import de.spring.webservices.auto.ParentEnumType;
-import de.spring.webservices.operations.Operations;
-
-
-@Service("customBindingExampleService")
-public class CustomBindingExampleServiceImpl implements
- Operations.RequestResponse<CustomBindingExampleResponse, CustomBindingExampleRequest> {
-
-
- @Override
- public CustomBindingExampleResponse requestResponse(final CustomBindingExampleRequest request) {
-
- CustomBindingExampleResponse response = new CustomBindingExampleResponse();
-
- response.setData("CUSTOM BINDING SNAKE EYES AND " + request.getData());
- response.setParentEnum(ParentEnumType.FIRST);
-
- return response;
- }
-
-}
+++ /dev/null
-package de.spring.webservices.services.impl;
-
-import org.springframework.stereotype.Service;
-
-import de.spring.webservices.auto.ExampleRequest;
-import de.spring.webservices.auto.ExampleResponse;
-import de.spring.webservices.services.ExampleService;
-
-
-@Service("exampleService")
-public class ExampleServiceImpl implements ExampleService {
-
- @Override
- public ExampleResponse doResponse(final ExampleRequest request) {
-
- ExampleResponse response = new ExampleResponse();
-
- response.setData("SNAKE EYES AND " + request.getData());
-
- return response;
- }
-
-}
+++ /dev/null
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure the Jetty Server instance with an ID "Server" -->
-<!-- by adding a HTTP connector. -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
- <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
- <Set name="secureScheme">https</Set>
- <Set name="securePort">
- <Property name="jetty.secure.port" default="8443" />
- </Set>
- <Set name="outputBufferSize">32768</Set>
- <Set name="requestHeaderSize">8192</Set>
- <Set name="responseHeaderSize">8192</Set>
- <Set name="sendServerVersion">true</Set>
- <Set name="sendDateHeader">false</Set>
- <Set name="headerCacheSize">512</Set>
-
- <!-- Uncomment to enable handling of X-Forwarded- style headers
- <Call name="addCustomizer">
- <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
- </Call>
- -->
- </New>
-
-
- <!-- =========================================================== -->
- <!-- Add a HTTP Connector. -->
- <!-- Configure an o.e.j.server.ServerConnector with a single -->
- <!-- HttpConnectionFactory instance using the common httpConfig -->
- <!-- instance defined in jetty.xml -->
- <!-- -->
- <!-- Consult the javadoc of o.e.j.server.ServerConnector and -->
- <!-- o.e.j.server.HttpConnectionFactory for all configuration -->
- <!-- that may be set here. -->
- <!-- =========================================================== -->
- <Call name="addConnector">
- <Arg>
- <New class="org.eclipse.jetty.server.ServerConnector">
- <Arg name="server">
- <Ref refid="Server" />
- </Arg>
- <Arg name="factories">
- <Array type="org.eclipse.jetty.server.ConnectionFactory">
- <Item>
- <New class="org.eclipse.jetty.server.HttpConnectionFactory">
- <Arg name="config">
- <Ref refid="httpConfig" />
- </Arg>
- </New>
- </Item>
- </Array>
- </Arg>
- <Set name="host">
- <Property name="jetty.host" default="127.0.0.1"/>
- </Set>
- <Set name="port">
- <Property name="jetty.port" default="8080" />
- </Set>
- <Set name="idleTimeout">
- <Property name="http.timeout" default="30000"/>
- </Set>
- </New>
- </Arg>
- </Call>
-
-</Configure>
+++ /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"
- xmlns:example="http://gumartinm.name/spring-ws/example"
- 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>
-
- <!-- Example of creating array list by means of XSD -->
- <xs:complexType name="car">
- <xs:sequence>
- <xs:element name="data" type="xs:string" />
- <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="100" />
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="truck">
- <xs:all>
- <xs:element name="data" type="xs:string" />
- <xs:element name="parentEnum" type="parent:parentEnumType" minOccurs="0" maxOccurs="1" />
- </xs:all>
- </xs:complexType>
- <xs:element name="vehicles">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="cars" type="example:car" maxOccurs="unbounded" />
- <xs:element name="trucks" type="example:truck" minOccurs="0" maxOccurs="100" />
- </xs:sequence>
- </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: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/util
- http://www.springframework.org/schema/util/spring-util.xsd">
-
-</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: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/web-services
- http://www.springframework.org/schema/web-services/web-services.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util.xsd">
-
- <!-- Searches for @Endpoint -->
- <context:component-scan base-package="de.spring.webservices"/>
-
- <!--
- Aqui se podría especificar un unmarshaller (para la request) o un
- marshaller (para la response) especifico. Por ejemplo Castor.
-
- Por la anotacion que uso para el EndPoint y porque tengo JAXB2 en el
- classpath, Spring lo que está haciendo es el equivalente a si se
- escribiera lo siguiente:
-
- <oxm:jaxb2-marshaller id="marshaller" context-path="de.spring.webservices.auto"/>
-
- Searches for @PayloadRoot
- <sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller"/>
- -->
- <sws:annotation-driven/>
-
- <!--
- Spring makes the WSDL file for us from the XSD file.
- Launch the Jetty server and download WSDL file from this URL:
- http://localhost:8080/web-services-spring-server/spring-ws/example/example.wsdl
- -->
- <sws:dynamic-wsdl id="example" portTypeName="Examples"
- createSoap12Binding="true" createSoap11Binding="false"
- locationUri="/spring-ws/example"
- targetNamespace="http://gumartinm.name/resource/wsdl/schemas">
- <sws:xsd location="classpath:examples.xsd"/>
- </sws:dynamic-wsdl>
-
-
- <bean id="parent" class="org.springframework.xml.xsd.SimpleXsdSchema">
- <property name="xsd" value="classpath:parent.xsd"/>
- </bean>
-
-
- <!-- 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="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>
- </sws:interceptors>
-
-
- <bean id="exceptionResolver"
- class="org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver">
- <property name="defaultFault" value="SERVER"/>
- <property name="exceptionMappings">
- <value>
- org.springframework.oxm.ValidationFailureException=CLIENT,Invalid request
- </value>
- </property>
- </bean>
-
-</beans>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
- version="2.4">
-
- <display-name>Spring Web Services: example</display-name>
-
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
-
- <context-param>
- <param-name>spring.profiles.active</param-name>
- <param-value>${environment.profile}</param-value>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- classpath*:spring-configuration/*.xml
- </param-value>
- </context-param>
-
- <!-- Spring SOAP servlet -->
- <servlet>
- <servlet-name>spring-ws</servlet-name>
- <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- <async-supported>true</async-supported>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath*:spring-configuration/ws/*.xml</param-value>
- </init-param>
- <init-param>
- <param-name>transformWsdlLocations</param-name>
- <param-value>true</param-value>
- </init-param>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>spring-ws</servlet-name>
- <url-pattern>/spring-ws/*</url-pattern>
- </servlet-mapping>
-
-</web-app>
+++ /dev/null
-package de.spring.webservices.endpoints;
-
-import static org.springframework.ws.test.server.RequestCreators.withPayload;
-import static org.springframework.ws.test.server.ResponseMatchers.payload;
-
-import javax.xml.transform.Source;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.ws.test.server.MockWebServiceClient;
-import org.springframework.xml.transform.StringSource;
-
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = { "classpath*:spring-configuration/ws/soap-ws.xml" } )
-public class ExampleEndPointIntegrationTest {
-
- @Autowired
- private ApplicationContext applicationContext;
-
- private MockWebServiceClient mockClient;
-
- @Before
- public void createClient() {
- mockClient = MockWebServiceClient.createClient(applicationContext);
- }
-
- @Test
- public void exampleEndpoint() throws Exception {
- final Source requestPayload = new StringSource(
- "<ExampleRequest xmlns='http://gumartinm.name/spring-ws/example'>" +
- "<data>SCARLETT</data>" +
- "</ExampleRequest>");
- final Source responsePayload = new StringSource(
- "<ns2:ExampleResponse xmlns:ns2='http://gumartinm.name/spring-ws/example'>" +
- "<ns2:data>SNAKE EYES AND SCARLETT</ns2:data>" +
- "</ns2:ExampleResponse>");
- mockClient.sendRequest(withPayload(requestPayload)).andExpect(
- payload(responsePayload));
-
-
- final Source customRequestPayload = new StringSource(
- "<CustomBindingExampleRequest xmlns='http://gumartinm.name/spring-ws/example'>" +
- "<data>SCARLETT</data>" +
- "<exampleDate>2015-06-03T10:20:30Z</exampleDate>" +
- "<parentEnum>FIRST</parentEnum>" +
- "</CustomBindingExampleRequest>");
- final Source customResponsePayload = new StringSource(
- "<ns2:CustomBindingExampleResponse xmlns:ns2='http://gumartinm.name/spring-ws/example'>" +
- "<ns2:data>CUSTOM BINDING SNAKE EYES AND SCARLETT</ns2:data>" +
- "<ns2:parentEnum>FIRST</ns2:parentEnum>" +
- "</ns2:CustomBindingExampleResponse>");
- mockClient.sendRequest(withPayload(customRequestPayload)).andExpect(
- payload(customResponsePayload));
- }
-}
-
+++ /dev/null
-package de.spring.webservices.endpoints;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import de.spring.webservices.auto.CustomBindingExampleRequest;
-import de.spring.webservices.auto.CustomBindingExampleResponse;
-import de.spring.webservices.auto.ExampleRequest;
-import de.spring.webservices.operations.Operations;
-import de.spring.webservices.services.ExampleService;
-
-
-public class ExampleEndPointTest {
-
- private ExampleService exampleService;
-
- private Operations.RequestResponse
- <CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService;
-
- private ExampleEndPoint exampleEndPoint;
-
- @Before
- public void init() {
- exampleService = mock(ExampleService.class);
- customBindingExampleService = mock(Operations.RequestResponse.class);
- exampleEndPoint = new ExampleEndPoint(customBindingExampleService, exampleService);
- }
-
- @Test
- public void givenExampleRequestThenInvokeExampleService() {
- ExampleRequest request = new ExampleRequest();
- request.setData("SCARLETT");
-
- exampleEndPoint.exampleResponse(request, null, null);
-
- verify(exampleService).doResponse(request);
- }
-
- @Test
- public void givenCustomBindingExampleRequestThenInvokeCustomBindingExampleService() {
- CustomBindingExampleRequest request = new CustomBindingExampleRequest();
- request.setData("SCARLETT");
-
- exampleEndPoint.cuntomBindingExampleResponse(request, null, null);
-
- verify(customBindingExampleService).requestResponse(request);
- }
-
-}
+++ /dev/null
-package de.spring.webservices.services;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import de.spring.webservices.auto.CustomBindingExampleRequest;
-import de.spring.webservices.auto.CustomBindingExampleResponse;
-import de.spring.webservices.operations.Operations;
-import de.spring.webservices.services.impl.CustomBindingExampleServiceImpl;
-
-
-public class CustomBindingExampleServiceTest {
-
- private Operations.RequestResponse
- <CustomBindingExampleResponse, CustomBindingExampleRequest> customBindingExampleService;
-
- @Before
- public void init() {
- customBindingExampleService = new CustomBindingExampleServiceImpl();
- }
-
- @Test
- public void givenCustomBindingExampleRequestThenReturnCustomBindingExampleResponse() {
- CustomBindingExampleRequest request = new CustomBindingExampleRequest();
- request.setData("SCARLETT");
- CustomBindingExampleResponse expected = new CustomBindingExampleResponse();
- expected.setData("CUSTOM BINDING SNAKE EYES AND " + request.getData());
-
- CustomBindingExampleResponse actual = customBindingExampleService.requestResponse(request);
-
- Assert.assertEquals(expected.getData(), actual.getData());
- }
-}
+++ /dev/null
-package de.spring.webservices.services;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import de.spring.webservices.auto.ExampleRequest;
-import de.spring.webservices.auto.ExampleResponse;
-import de.spring.webservices.services.impl.ExampleServiceImpl;
-
-public class ExampleServiceTest {
-
- private ExampleService exampleService;
-
- @Before
- public void init() {
- exampleService = new ExampleServiceImpl();
- }
-
- @Test
- public void givenExampleRequestThenReturnExampleResponse() {
- ExampleRequest request = new ExampleRequest();
- request.setData("SCARLETT");
- ExampleResponse expected = new ExampleResponse();
- expected.setData("SNAKE EYES AND " + request.getData());
-
- ExampleResponse actual = exampleService.doResponse(request);
-
- Assert.assertEquals(expected.getData(), actual.getData());
- }
-
-}
+++ /dev/null
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>de.spring.webservices</groupId>
- <artifactId>web-services-spring</artifactId>
- <packaging>pom</packaging>
- <version>1.0-SNAPSHOT</version>
- <name>web-services-spring</name>
- <url>http://gumartinm.name</url>
- <description>Web Services Spring Framework</description>
- <organization>
- <name>Gustavo Martin Morcuende</name>
- <url>http://www.gumartinm.name</url>
- </organization>
- <scm>
- <developerConnection>scm:git:http://git.gumartinm.name/SpringWebServicesForFun</developerConnection>
- <url>http://git.gumartinm.name/SpringWebServicesForFun</url>
- </scm>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <!-- Be aware: spring-ws latest version does not follow spring-context latest version -->
- <spring.version>4.0.9.RELEASE</spring.version>
- <spring.ws.version>2.2.1.RELEASE</spring.ws.version>
- </properties>
-
- <profiles>
- <profile>
- <id>release</id>
- <properties>
- <environment.profile>release</environment.profile>
- </properties>
- <activation>
- <activeByDefault>true</activeByDefault>
- </activation>
- </profile>
- </profiles>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-slf4j-impl</artifactId>
- <version>2.3</version>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <version>2.3</version>
- </dependency>
- <dependency>
- <groupId>cglib</groupId>
- <artifactId>cglib</artifactId>
- <version>2.2.2</version>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-ws-core</artifactId>
- <version>${spring.ws.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-xml</artifactId>
- <version>${spring.ws.version}</version>
- </dependency>
- <dependency>
- <groupId>org.jdom</groupId>
- <artifactId>jdom</artifactId>
- <version>2.0.2</version>
- </dependency>
-
- <!-- Required by spring-ws-core -->
- <dependency>
- <groupId>wsdl4j</groupId>
- <artifactId>wsdl4j</artifactId>
- <version>1.6.3</version>
- </dependency>
-
- <!-- Unitary and integration tests -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.ws</groupId>
- <artifactId>spring-ws-test</artifactId>
- <version>${spring.ws.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>2.0.11-beta</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <build>
-
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>2.18.1</version>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-failsafe-plugin</artifactId>
- <version>2.18.1</version>
- </plugin>
- </plugins>
- </pluginManagement>
-
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.3</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-resources-plugin</artifactId>
- <version>2.7</version>
- <configuration>
- <encoding>${project.build.sourceEncoding}</encoding>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <archive>
- <manifestEntries>
- <Specification-Title>${project.description}</Specification-Title>
- <Specification-Version>${project.version}</Specification-Version>
- <Specification-Vendor>${project.organization.name}</Specification-Vendor>
- <Implementation-Title>${project.description}</Implementation-Title>
- <Implementation-Version>${project.version}</Implementation-Version>
- <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
- </manifestEntries>
- </archive>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <configuration>
- <excludes>
- <exclude>**/*IntegrationTest.java</exclude>
- </excludes>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-failsafe-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>integration-test</goal>
- <goal>verify</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <includes>
- <include>**/*IntegrationTest.java</include>
- </includes>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>