Commit 7d4e558f authored by Huang YunKun's avatar Huang YunKun Committed by Stephane Nicoll

Use PropertyMapper to configure WebServerFactory

See gh-11773
parent 584985c7
...@@ -20,6 +20,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties; ...@@ -20,6 +20,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.embedded.jetty.JettyCustomizer; import org.springframework.boot.autoconfigure.web.embedded.jetty.JettyCustomizer;
import org.springframework.boot.autoconfigure.web.embedded.tomcat.TomcatCustomizer; import org.springframework.boot.autoconfigure.web.embedded.tomcat.TomcatCustomizer;
import org.springframework.boot.autoconfigure.web.embedded.undertow.UndertowCustomizer; import org.springframework.boot.autoconfigure.web.embedded.undertow.UndertowCustomizer;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.boot.web.embedded.jetty.JettyReactiveWebServerFactory; import org.springframework.boot.web.embedded.jetty.JettyReactiveWebServerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFactory;
import org.springframework.boot.web.embedded.undertow.UndertowReactiveWebServerFactory; import org.springframework.boot.web.embedded.undertow.UndertowReactiveWebServerFactory;
...@@ -33,6 +34,7 @@ import org.springframework.core.env.Environment; ...@@ -33,6 +34,7 @@ import org.springframework.core.env.Environment;
* Default {@link WebServerFactoryCustomizer} for reactive servers. * Default {@link WebServerFactoryCustomizer} for reactive servers.
* *
* @author Brian Clozel * @author Brian Clozel
* @author Yunkun Huang
* @since 2.0.0 * @since 2.0.0
*/ */
public class DefaultReactiveWebServerFactoryCustomizer public class DefaultReactiveWebServerFactoryCustomizer
...@@ -59,33 +61,21 @@ public class DefaultReactiveWebServerFactoryCustomizer ...@@ -59,33 +61,21 @@ public class DefaultReactiveWebServerFactoryCustomizer
@Override @Override
public void customize(ConfigurableReactiveWebServerFactory factory) { public void customize(ConfigurableReactiveWebServerFactory factory) {
if (this.serverProperties.getPort() != null) { PropertyMapper map = PropertyMapper.get();
factory.setPort(this.serverProperties.getPort()); map.from(this.serverProperties::getPort).whenNonNull().to(factory::setPort);
} map.from(this.serverProperties::getAddress).whenNonNull().to(factory::setAddress);
if (this.serverProperties.getAddress() != null) { map.from(this.serverProperties::getSsl).whenNonNull().to(factory::setSsl);
factory.setAddress(this.serverProperties.getAddress()); map.from(this.serverProperties::getCompression).whenNonNull().to(factory::setCompression);
} map.from(this.serverProperties::getHttp2).whenNonNull().to(factory::setHttp2);
if (this.serverProperties.getSsl() != null) { map.from(() -> factory).when(configurableReactiveWebServerFactory -> factory instanceof TomcatReactiveWebServerFactory)
factory.setSsl(this.serverProperties.getSsl()); .to(configurableReactiveWebServerFactory -> TomcatCustomizer.customizeTomcat(this.serverProperties, this.environment,
} (TomcatReactiveWebServerFactory) factory));
if (this.serverProperties.getCompression() != null) { map.from(() -> factory).when(configurableReactiveWebServerFactory -> factory instanceof JettyReactiveWebServerFactory)
factory.setCompression(this.serverProperties.getCompression()); .to(configurableReactiveWebServerFactory -> JettyCustomizer.customizeJetty(this.serverProperties, this.environment,
} (JettyReactiveWebServerFactory) factory));
if (this.serverProperties.getHttp2() != null) { map.from(() -> factory).when(configurableReactiveWebServerFactory -> factory instanceof UndertowReactiveWebServerFactory)
factory.setHttp2(this.serverProperties.getHttp2()); .to(configurableReactiveWebServerFactory -> UndertowCustomizer.customizeUndertow(this.serverProperties, this.environment,
} (UndertowReactiveWebServerFactory) factory));
if (factory instanceof TomcatReactiveWebServerFactory) {
TomcatCustomizer.customizeTomcat(this.serverProperties, this.environment,
(TomcatReactiveWebServerFactory) factory);
}
if (factory instanceof JettyReactiveWebServerFactory) {
JettyCustomizer.customizeJetty(this.serverProperties, this.environment,
(JettyReactiveWebServerFactory) factory);
}
if (factory instanceof UndertowReactiveWebServerFactory) {
UndertowCustomizer.customizeUndertow(this.serverProperties, this.environment,
(UndertowReactiveWebServerFactory) factory);
}
} }
} }
...@@ -20,6 +20,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties; ...@@ -20,6 +20,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.embedded.jetty.JettyCustomizer; import org.springframework.boot.autoconfigure.web.embedded.jetty.JettyCustomizer;
import org.springframework.boot.autoconfigure.web.embedded.tomcat.TomcatCustomizer; import org.springframework.boot.autoconfigure.web.embedded.tomcat.TomcatCustomizer;
import org.springframework.boot.autoconfigure.web.embedded.undertow.UndertowCustomizer; import org.springframework.boot.autoconfigure.web.embedded.undertow.UndertowCustomizer;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory; import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
...@@ -37,6 +38,7 @@ import org.springframework.util.ObjectUtils; ...@@ -37,6 +38,7 @@ import org.springframework.util.ObjectUtils;
* @author Brian Clozel * @author Brian Clozel
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Olivier Lamy * @author Olivier Lamy
* @author Yunkun Huang
* @since 2.0.0 * @since 2.0.0
*/ */
public class DefaultServletWebServerFactoryCustomizer public class DefaultServletWebServerFactoryCustomizer
...@@ -67,49 +69,30 @@ public class DefaultServletWebServerFactoryCustomizer ...@@ -67,49 +69,30 @@ public class DefaultServletWebServerFactoryCustomizer
@Override @Override
public void customize(ConfigurableServletWebServerFactory factory) { public void customize(ConfigurableServletWebServerFactory factory) {
if (this.serverProperties.getPort() != null) { PropertyMapper map = PropertyMapper.get();
factory.setPort(this.serverProperties.getPort()); map.from(this.serverProperties::getPort).whenNonNull().to(factory::setPort);
} map.from(this.serverProperties::getAddress).whenNonNull().to(factory::setAddress);
if (this.serverProperties.getAddress() != null) { map.from(this.serverProperties.getServlet()::getContextPath).whenNonNull().to(factory::setContextPath);
factory.setAddress(this.serverProperties.getAddress()); map.from(this.serverProperties::getDisplayName).whenNonNull().to(factory::setDisplayName);
} map.from(this.serverProperties.getServlet()::getSession).to(factory::setSession);
if (this.serverProperties.getServlet().getContextPath() != null) { map.from(this.serverProperties::getSsl).whenNonNull().to(factory::setSsl);
factory.setContextPath(this.serverProperties.getServlet().getContextPath()); map.from(this.serverProperties::getServlet).whenNonNull().as(ServerProperties.Servlet::getJsp).to(factory::setJsp);
} map.from(this.serverProperties::getCompression).whenNonNull().to(factory::setCompression);
if (this.serverProperties.getDisplayName() != null) { map.from(this.serverProperties::getHttp2).whenNonNull().to(factory::setHttp2);
factory.setDisplayName(this.serverProperties.getDisplayName()); map.from(this.serverProperties::getServerHeader).to(factory::setServerHeader);
} map.from(() -> factory).when(configurableServletWebServerFactory -> factory instanceof TomcatServletWebServerFactory)
factory.setSession(this.serverProperties.getServlet().getSession()); .to(configurableServletWebServerFactory -> {
if (this.serverProperties.getSsl() != null) { TomcatServletWebServerFactory tomcatFactory = (TomcatServletWebServerFactory) factory;
factory.setSsl(this.serverProperties.getSsl()); TomcatCustomizer.customizeTomcat(this.serverProperties, this.environment, tomcatFactory);
} TomcatServletCustomizer.customizeTomcat(this.serverProperties, this.environment, tomcatFactory);
if (this.serverProperties.getServlet() != null) { });
factory.setJsp(this.serverProperties.getServlet().getJsp()); map.from(() -> factory).when(configurableServletWebServerFactory -> factory instanceof JettyServletWebServerFactory)
} .to(configurableServletWebServerFactory -> JettyCustomizer.customizeJetty(this.serverProperties, this.environment,
if (this.serverProperties.getCompression() != null) { (JettyServletWebServerFactory) factory));
factory.setCompression(this.serverProperties.getCompression()); map.from(() -> factory).when(configurableServletWebServerFactory -> factory instanceof UndertowServletWebServerFactory)
} .to(configurableServletWebServerFactory -> UndertowCustomizer.customizeUndertow(this.serverProperties, this.environment,
if (this.serverProperties.getHttp2() != null) { (UndertowServletWebServerFactory) factory));
factory.setHttp2(this.serverProperties.getHttp2()); map.from(this.serverProperties.getServlet()::getContextParameters).to(factory::setInitParameters);
}
factory.setServerHeader(this.serverProperties.getServerHeader());
if (factory instanceof TomcatServletWebServerFactory) {
TomcatServletWebServerFactory tomcatFactory = (TomcatServletWebServerFactory) factory;
TomcatCustomizer.customizeTomcat(this.serverProperties, this.environment,
tomcatFactory);
TomcatServletCustomizer.customizeTomcat(this.serverProperties,
this.environment, tomcatFactory);
}
if (factory instanceof JettyServletWebServerFactory) {
JettyCustomizer.customizeJetty(this.serverProperties, this.environment,
(JettyServletWebServerFactory) factory);
}
if (factory instanceof UndertowServletWebServerFactory) {
UndertowCustomizer.customizeUndertow(this.serverProperties, this.environment,
(UndertowServletWebServerFactory) factory);
}
factory.setInitParameters(
this.serverProperties.getServlet().getContextParameters());
} }
private static class TomcatServletCustomizer { private static class TomcatServletCustomizer {
......
...@@ -46,6 +46,7 @@ import org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFacto ...@@ -46,6 +46,7 @@ import org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFacto
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.boot.web.embedded.undertow.UndertowReactiveWebServerFactory; import org.springframework.boot.web.embedded.undertow.UndertowReactiveWebServerFactory;
import org.springframework.boot.web.reactive.server.ConfigurableReactiveWebServerFactory; import org.springframework.boot.web.reactive.server.ConfigurableReactiveWebServerFactory;
import org.springframework.boot.web.server.Ssl;
import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.HttpHandler;
import org.springframework.mock.env.MockEnvironment; import org.springframework.mock.env.MockEnvironment;
...@@ -60,6 +61,7 @@ import static org.mockito.Mockito.verify; ...@@ -60,6 +61,7 @@ import static org.mockito.Mockito.verify;
* Tests for {@link DefaultReactiveWebServerFactoryCustomizer}. * Tests for {@link DefaultReactiveWebServerFactoryCustomizer}.
* *
* @author Brian Clozel * @author Brian Clozel
* @author Yunkun Huang
*/ */
public class DefaultReactiveWebServerFactoryCustomizerTests { public class DefaultReactiveWebServerFactoryCustomizerTests {
...@@ -91,6 +93,16 @@ public class DefaultReactiveWebServerFactoryCustomizerTests { ...@@ -91,6 +93,16 @@ public class DefaultReactiveWebServerFactoryCustomizerTests {
verify(factory).setAddress(address); verify(factory).setAddress(address);
} }
@Test
public void testCustomizeServerSsl() {
ConfigurableReactiveWebServerFactory factory = mock(
ConfigurableReactiveWebServerFactory.class);
Ssl ssl = mock(Ssl.class);
this.properties.setSsl(ssl);
this.customizer.customize(factory);
verify(factory).setSsl(ssl);
}
@Test @Test
public void tomcatAccessLogIsDisabledByDefault() { public void tomcatAccessLogIsDisabledByDefault() {
TomcatReactiveWebServerFactory factory = new TomcatReactiveWebServerFactory(); TomcatReactiveWebServerFactory factory = new TomcatReactiveWebServerFactory();
......
...@@ -49,13 +49,16 @@ import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer; ...@@ -49,13 +49,16 @@ import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.Ssl;
import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.servlet.server.Jsp;
import org.springframework.boot.web.servlet.server.Session; import org.springframework.boot.web.servlet.server.Session;
import org.springframework.boot.web.servlet.server.Session.Cookie; import org.springframework.boot.web.servlet.server.Session.Cookie;
import org.springframework.mock.env.MockEnvironment; import org.springframework.mock.env.MockEnvironment;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
...@@ -66,6 +69,7 @@ import static org.mockito.Mockito.verify; ...@@ -66,6 +69,7 @@ import static org.mockito.Mockito.verify;
* Tests for {@link DefaultServletWebServerFactoryCustomizer}. * Tests for {@link DefaultServletWebServerFactoryCustomizer}.
* *
* @author Brian Clozel * @author Brian Clozel
* @author Yunkun Huang
*/ */
public class DefaultServletWebServerFactoryCustomizerTests { public class DefaultServletWebServerFactoryCustomizerTests {
...@@ -203,6 +207,24 @@ public class DefaultServletWebServerFactoryCustomizerTests { ...@@ -203,6 +207,24 @@ public class DefaultServletWebServerFactoryCustomizerTests {
verify(factory).setDisplayName("TestName"); verify(factory).setDisplayName("TestName");
} }
@Test
public void testCustomizeSsl() {
ConfigurableServletWebServerFactory factory = mock(
ConfigurableServletWebServerFactory.class);
Ssl ssl = mock(Ssl.class);
this.properties.setSsl(ssl);
this.customizer.customize(factory);
verify(factory).setSsl(ssl);
}
@Test
public void testCustomizeJsp() {
ConfigurableServletWebServerFactory factory = mock(
ConfigurableServletWebServerFactory.class);
this.customizer.customize(factory);
verify(factory).setJsp(any(Jsp.class));
}
@Test @Test
public void customizeSessionProperties() throws Exception { public void customizeSessionProperties() throws Exception {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment