diff --git a/pom.xml b/pom.xml
index 648f94c76d..1c016a2ea9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -750,6 +750,7 @@
spring-security-x509
spring-session
spring-sleuth
+ spring-soap
spring-social-login
spring-spel
spring-state-machine
@@ -1460,6 +1461,7 @@
spring-security-x509
spring-session
spring-sleuth
+ spring-soap
spring-social-login
spring-spel
spring-state-machine
diff --git a/spring-soap/.gitignore b/spring-soap/.gitignore
new file mode 100644
index 0000000000..b83d22266a
--- /dev/null
+++ b/spring-soap/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml
new file mode 100644
index 0000000000..2865a4c3bc
--- /dev/null
+++ b/spring-soap/pom.xml
@@ -0,0 +1,68 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ spring-soap
+ 1.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.2.RELEASE
+
+
+
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web-services
+
+
+ wsdl4j
+ wsdl4j
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+ org.codehaus.mojo
+ jaxb2-maven-plugin
+ 1.6
+
+
+ xjc
+
+ xjc
+
+
+
+
+ ${project.basedir}/src/main/resources/
+ ${project.basedir}/src/main/java
+ false
+
+
+
+
+
+
+
diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/Application.java b/spring-soap/src/main/java/com/baeldung/springsoap/Application.java
new file mode 100644
index 0000000000..ad9258447c
--- /dev/null
+++ b/spring-soap/src/main/java/com/baeldung/springsoap/Application.java
@@ -0,0 +1,12 @@
+package com.baeldung.springsoap;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/CountryEndpoint.java b/spring-soap/src/main/java/com/baeldung/springsoap/CountryEndpoint.java
new file mode 100644
index 0000000000..745131767a
--- /dev/null
+++ b/spring-soap/src/main/java/com/baeldung/springsoap/CountryEndpoint.java
@@ -0,0 +1,30 @@
+package com.baeldung.springsoap;
+
+import com.baeldung.springsoap.gen.*;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+@Endpoint
+public class CountryEndpoint {
+
+ private static final String NAMESPACE_URI = "http://www.baeldung.com/springsoap/gen";
+
+ private CountryRepository countryRepository;
+
+ @Autowired
+ public CountryEndpoint(CountryRepository countryRepository) {
+ this.countryRepository = countryRepository;
+ }
+
+ @PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCountryRequest")
+ @ResponsePayload
+ public GetCountryResponse getCountry(@RequestPayload GetCountryRequest request) {
+ GetCountryResponse response = new GetCountryResponse();
+ response.setCountry(countryRepository.findCountry(request.getName()));
+
+ return response;
+ }
+}
diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java b/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java
new file mode 100644
index 0000000000..8a0f58a64e
--- /dev/null
+++ b/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java
@@ -0,0 +1,47 @@
+package com.baeldung.springsoap;
+
+import com.baeldung.springsoap.gen.*;
+import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class CountryRepository {
+
+ private static final Map countries = new HashMap<>();
+
+ @PostConstruct
+ public void initData() {
+ Country spain = new Country();
+ spain.setName("Spain");
+ spain.setCapital("Madrid");
+ spain.setCurrency(Currency.EUR);
+ spain.setPopulation(46704314);
+
+ countries.put(spain.getName(), spain);
+
+ Country poland = new Country();
+ poland.setName("Poland");
+ poland.setCapital("Warsaw");
+ poland.setCurrency(Currency.PLN);
+ poland.setPopulation(38186860);
+
+ countries.put(poland.getName(), poland);
+
+ Country uk = new Country();
+ uk.setName("United Kingdom");
+ uk.setCapital("London");
+ uk.setCurrency(Currency.GBP);
+ uk.setPopulation(63705000);
+
+ countries.put(uk.getName(), uk);
+ }
+
+ public Country findCountry(String name) {
+ Assert.notNull(name, "The country's name must not be null");
+ return countries.get(name);
+ }
+}
diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/WebServiceConfig.java b/spring-soap/src/main/java/com/baeldung/springsoap/WebServiceConfig.java
new file mode 100644
index 0000000000..930a961208
--- /dev/null
+++ b/spring-soap/src/main/java/com/baeldung/springsoap/WebServiceConfig.java
@@ -0,0 +1,41 @@
+package com.baeldung.springsoap;
+
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.ws.config.annotation.EnableWs;
+import org.springframework.ws.config.annotation.WsConfigurerAdapter;
+import org.springframework.ws.transport.http.MessageDispatcherServlet;
+import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition;
+import org.springframework.xml.xsd.SimpleXsdSchema;
+import org.springframework.xml.xsd.XsdSchema;
+
+@EnableWs
+@Configuration
+public class WebServiceConfig extends WsConfigurerAdapter {
+
+ @Bean
+ public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
+ MessageDispatcherServlet servlet = new MessageDispatcherServlet();
+ servlet.setApplicationContext(applicationContext);
+ servlet.setTransformWsdlLocations(true);
+ return new ServletRegistrationBean(servlet, "/ws/*");
+ }
+
+ @Bean(name = "countries")
+ public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {
+ DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
+ wsdl11Definition.setPortTypeName("CountriesPort");
+ wsdl11Definition.setLocationUri("/ws");
+ wsdl11Definition.setTargetNamespace("http://www.baeldung.com/springsoap/gen");
+ wsdl11Definition.setSchema(countriesSchema);
+ return wsdl11Definition;
+ }
+
+ @Bean
+ public XsdSchema countriesSchema() {
+ return new SimpleXsdSchema(new ClassPathResource("countries.xsd"));
+ }
+}
diff --git a/spring-soap/src/main/resources/countries.xsd b/spring-soap/src/main/resources/countries.xsd
new file mode 100644
index 0000000000..524e5ac2d5
--- /dev/null
+++ b/spring-soap/src/main/resources/countries.xsd
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-soap/src/test/java/com/baeldung/springsoap/ApplicationIntegrationTest.java b/spring-soap/src/test/java/com/baeldung/springsoap/ApplicationIntegrationTest.java
new file mode 100644
index 0000000000..3b071c286f
--- /dev/null
+++ b/spring-soap/src/test/java/com/baeldung/springsoap/ApplicationIntegrationTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.springsoap;
+
+import com.baeldung.springsoap.gen.GetCountryRequest;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.util.ClassUtils;
+import org.springframework.ws.client.core.WebServiceTemplate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+public class ApplicationIntegrationTest {
+
+ private Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
+
+ @LocalServerPort private int port = 0;
+
+ @Before
+ public void init() throws Exception {
+ marshaller.setPackagesToScan(ClassUtils.getPackageName(GetCountryRequest.class));
+ marshaller.afterPropertiesSet();
+ }
+
+ @Test
+ public void whenSendRequest_thenResponseIsNotNull() {
+ WebServiceTemplate ws = new WebServiceTemplate(marshaller);
+ GetCountryRequest request = new GetCountryRequest();
+ request.setName("Spain");
+
+ assertThat(ws.marshalSendAndReceive("http://localhost:" + port + "/ws", request)).isNotNull();
+ }
+}
diff --git a/spring-soap/src/test/resources/request.xml b/spring-soap/src/test/resources/request.xml
new file mode 100644
index 0000000000..7a94aeeee6
--- /dev/null
+++ b/spring-soap/src/test/resources/request.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ Spain
+
+
+
+
+
+
+
+
+
+ Spain
+ 46704314
+ Madrid
+ EUR
+
+
+
+
\ No newline at end of file