diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsAutoConfiguration.java index 9393922856..36c61b3677 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsAutoConfiguration.java @@ -29,8 +29,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.ws.config.annotation.DelegatingWsConfiguration; +import org.springframework.ws.config.annotation.EnableWs; import org.springframework.ws.config.annotation.WsConfigurationSupport; import org.springframework.ws.transport.http.MessageDispatcherServlet; @@ -38,6 +37,7 @@ import org.springframework.ws.transport.http.MessageDispatcherServlet; * {@link EnableAutoConfiguration Auto-configuration} for Spring Web Services. * * @author Vedran Pavic + * @author Stephane Nicoll * @since 1.4.0 */ @Configuration @@ -48,7 +48,7 @@ import org.springframework.ws.transport.http.MessageDispatcherServlet; @AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class) public class WsAutoConfiguration { - private WsProperties properties; + private final WsProperties properties; public WsAutoConfiguration(WsProperties properties) { this.properties = properties; @@ -63,15 +63,16 @@ public class WsAutoConfiguration { String urlMapping = (path.endsWith("/") ? path + "*" : path + "/*"); ServletRegistrationBean registration = new ServletRegistrationBean( servlet, urlMapping); - registration.setLoadOnStartup(this.properties.getServlet().getLoadOnStartup()); - for (Map.Entry entry : this.properties.getInit().entrySet()) { + WsProperties.Servlet servletProperties = this.properties.getServlet(); + registration.setLoadOnStartup(servletProperties.getLoadOnStartup()); + for (Map.Entry entry : servletProperties.getInit().entrySet()) { registration.addInitParameter(entry.getKey(), entry.getValue()); } return registration; } @Configuration - @Import(DelegatingWsConfiguration.class) + @EnableWs protected static class WsConfiguration { } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsProperties.java index d66e960396..b6dfea612f 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/ws/WsProperties.java @@ -28,6 +28,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * {@link ConfigurationProperties} for Spring Web Services. * * @author Vedran Pavic + * @author Stephane Nicoll * @since 1.4.0 */ @ConfigurationProperties("spring.ws") @@ -40,11 +41,6 @@ public class WsProperties { @Pattern(regexp = "/[^?#]*", message = "Path must start with /") private String path = "/services"; - /** - * Init parameters to pass to Spring Web Services via the servlet. - */ - private Map init = new HashMap(); - private final Servlet servlet = new Servlet(); public String getPath() { @@ -55,25 +51,31 @@ public class WsProperties { this.path = path; } - public Map getInit() { - return this.init; - } - - public void setInit(Map init) { - this.init = init; - } - public Servlet getServlet() { return this.servlet; } + public static class Servlet { + /** + * Servlet init parameters to pass to Spring Web Services. + */ + private Map init = new HashMap(); + /** * Load on startup priority of the Spring Web Services servlet. */ private int loadOnStartup = -1; + public Map getInit() { + return this.init; + } + + public void setInit(Map init) { + this.init = init; + } + public int getLoadOnStartup() { return this.loadOnStartup; } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ws/WsAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ws/WsAutoConfigurationTests.java index 83e8b0195a..1541aa028d 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ws/WsAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/ws/WsAutoConfigurationTests.java @@ -17,7 +17,6 @@ package org.springframework.boot.autoconfigure.ws; import org.junit.After; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -35,18 +34,14 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link WsAutoConfiguration}. * * @author Vedran Pavic + * @author Stephane Nicoll */ public class WsAutoConfigurationTests { - private AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); - @Rule public ExpectedException thrown = ExpectedException.none(); - @Before - public void setupContext() { - this.context.setServletContext(new MockServletContext()); - } + private AnnotationConfigWebApplicationContext context; @After public void close() { @@ -57,7 +52,7 @@ public class WsAutoConfigurationTests { @Test public void defaultConfiguration() { - registerAndRefresh(WsAutoConfiguration.class); + load(WsAutoConfiguration.class); assertThat(this.context.getBeansOfType(ServletRegistrationBean.class)).hasSize(1); } @@ -66,27 +61,19 @@ public class WsAutoConfigurationTests { public void customPathMustBeginWithASlash() { this.thrown.expect(BeanCreationException.class); this.thrown.expectMessage("Path must start with /"); - EnvironmentTestUtils.addEnvironment(this.context, - "spring.ws.path=invalid"); - registerAndRefresh(WsAutoConfiguration.class); + load(WsAutoConfiguration.class, "spring.ws.path=invalid"); } @Test public void customPathWithTrailingSlash() { - EnvironmentTestUtils.addEnvironment(this.context, - "spring.ws.path=/valid/"); - registerAndRefresh(WsAutoConfiguration.class); - + load(WsAutoConfiguration.class, "spring.ws.path=/valid/"); assertThat(this.context.getBean(ServletRegistrationBean.class).getUrlMappings()) .contains("/valid/*"); } @Test public void customPath() { - EnvironmentTestUtils.addEnvironment(this.context, - "spring.ws.path=/valid"); - registerAndRefresh(WsAutoConfiguration.class); - + load(WsAutoConfiguration.class, "spring.ws.path=/valid"); assertThat(this.context.getBeansOfType(ServletRegistrationBean.class)).hasSize(1); assertThat(this.context.getBean(ServletRegistrationBean.class).getUrlMappings()) .contains("/valid/*"); @@ -94,10 +81,7 @@ public class WsAutoConfigurationTests { @Test public void customLoadOnStartup() { - EnvironmentTestUtils.addEnvironment(this.context, - "spring.ws.servlet.load-on-startup=1"); - registerAndRefresh(WsAutoConfiguration.class); - + load(WsAutoConfiguration.class, "spring.ws.servlet.load-on-startup=1"); ServletRegistrationBean registrationBean = this.context .getBean(ServletRegistrationBean.class); assertThat(ReflectionTestUtils.getField(registrationBean, "loadOnStartup")) @@ -106,19 +90,21 @@ public class WsAutoConfigurationTests { @Test public void customInitParameters() { - EnvironmentTestUtils.addEnvironment(this.context, - "spring.ws.init.key1=value1", "spring.ws.init.key2=value2"); - registerAndRefresh(WsAutoConfiguration.class); - + load(WsAutoConfiguration.class, "spring.ws.servlet.init.key1=value1", + "spring.ws.servlet.init.key2=value2"); ServletRegistrationBean registrationBean = this.context .getBean(ServletRegistrationBean.class); assertThat(registrationBean.getInitParameters()).containsEntry("key1", "value1"); assertThat(registrationBean.getInitParameters()).containsEntry("key2", "value2"); } - private void registerAndRefresh(Class... annotatedClasses) { - this.context.register(annotatedClasses); - this.context.refresh(); + private void load(Class config, String... environment) { + AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); + ctx.setServletContext(new MockServletContext()); + EnvironmentTestUtils.addEnvironment(ctx, environment); + ctx.register(config); + ctx.refresh(); + this.context = ctx; } } diff --git a/spring-boot-docs/pom.xml b/spring-boot-docs/pom.xml index 30a4b84036..99a5dba842 100644 --- a/spring-boot-docs/pom.xml +++ b/spring-boot-docs/pom.xml @@ -843,6 +843,7 @@ ${spring-boot-repo} ${spring.version} ${spring-security.version} + ${spring-ws.version} ${github-tag} diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index d54cce9ee3..50f5aaa543 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -406,6 +406,11 @@ content into your application; rather pick only the properties that you need. spring.velocity.toolbox-config-location= # Velocity Toolbox config location. For instance `/WEB-INF/toolbox.xml` spring.velocity.view-names= # White list of view names that can be resolved. + # WEB SERVICES ({sc-spring-boot-autoconfigure}/ws/WsProperties.{sc-ext}[WsProperties]) + spring.ws.path=/services # Path that serves as the base URI for the services. + spring.ws.servlet.init= # Servlet init parameters to pass to Spring Web Services. + spring.ws.servlet.load-on-startup=-1 # Load on startup priority of the Spring Web Services servlet. + [[common-application-properties-security]] # ---------------------------------------- diff --git a/spring-boot-docs/src/main/asciidoc/index.adoc b/spring-boot-docs/src/main/asciidoc/index.adoc index 99e0526a29..6a8b7c2047 100644 --- a/spring-boot-docs/src/main/asciidoc/index.adoc +++ b/spring-boot-docs/src/main/asciidoc/index.adoc @@ -37,6 +37,7 @@ Phillip Webb; Dave Syer; Josh Long; Stéphane Nicoll; Rob Winch; Andy Wilkinson; :spring-boot-maven-plugin-site: http://docs.spring.io/spring-boot/docs/{spring-boot-docs-version}/maven-plugin :spring-reference: http://docs.spring.io/spring/docs/{spring-docs-version}/spring-framework-reference/htmlsingle :spring-security-reference: http://docs.spring.io/spring-security/site/docs/{spring-security-docs-version}/reference/htmlsingle +:spring-ws-reference: http://docs.spring.io/spring-ws/docs/{spring-ws-docs-version}/reference/htmlsingle :spring-javadoc: http://docs.spring.io/spring/docs/{spring-docs-version}/javadoc-api/org/springframework :spring-amqp-javadoc: http://docs.spring.io/spring-amqp/docs/current/api/org/springframework/amqp :spring-data-javadoc: http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 72f7d00615..f92a98a4f6 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -4990,6 +4990,28 @@ public class MyTest { +[[boot-features-websockets]] +== WebSockets +Spring Boot provides WebSockets auto-configuration for embedded Tomcat (8 and 7), Jetty 9 +and Undertow. If you're deploying a war file to a standalone container, Spring Boot +assumes that the container will be responsible for the configuration of its WebSocket +support. + +Spring Framework provides {spring-reference}/#websocket[rich WebSocket support] that can +be easily accessed via the `spring-boot-starter-websocket` module. + + + +[[boot-features-ws]] +== Web Services +Spring Boot provides Web Services auto-configuration so that all is required is defining +your `Endpoints`. + +The {spring-ws-reference}[Spring Web Services features] can be easily accessed via the +`spring-boot-starter-ws` module. + + + [[boot-features-developing-auto-configuration]] == Creating your own auto-configuration If you work in a company that develops shared libraries, or if you work on an open-source @@ -5198,18 +5220,6 @@ library. -[[boot-features-websockets]] -== WebSockets -Spring Boot provides WebSockets auto-configuration for embedded Tomcat (8 and 7), Jetty 9 -and Undertow. If you're deploying a war file to a standalone container, Spring Boot -assumes that the container will be responsible for the configuration of its WebSocket -support. - -Spring Framework provides {spring-reference}/#websocket[rich WebSocket support] that can -be easily accessed via the `spring-boot-starter-websocket` module. - - - [[boot-features-whats-next]] == What to read next If you want to learn more about any of the classes discussed in this section you can diff --git a/spring-boot-samples/spring-boot-sample-ws/src/main/java/sample/ws/WebServiceConfig.java b/spring-boot-samples/spring-boot-sample-ws/src/main/java/sample/ws/WebServiceConfig.java index 77c9b70062..4b8fa33b8e 100644 --- a/spring-boot-samples/spring-boot-sample-ws/src/main/java/sample/ws/WebServiceConfig.java +++ b/spring-boot-samples/spring-boot-sample-ws/src/main/java/sample/ws/WebServiceConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.