Browse Source

Merge pull request #34332 from terminux

* pr/34332:
  Polish "Disable embedded web auto-config when not using embedded web server"
  Disable embedded web auto-config when not using embedded web server

Closes gh-34332
pull/34697/head
Scott Frederick 3 years ago
parent
commit
e593a8d328
  1. 41
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnNotWarDeployment.java
  2. 7
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnWarDeploymentCondition.java
  3. 4
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration.java
  4. 77
      spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnNotWarDeploymentTests.java
  5. 6
      spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/developing-auto-configuration.adoc

41
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnNotWarDeployment.java

@ -0,0 +1,41 @@
/*
* Copyright 2012-2023 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.condition;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Conditional;
/**
* {@link Conditional @Conditional} that only matches when the application is not a
* traditional WAR deployment. For applications with embedded servers, this condition will
* return true.
*
* @author Guirong Hu
* @since 2.7.10
*/
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnWarDeploymentCondition.class)
public @interface ConditionalOnNotWarDeployment {
}

7
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnWarDeploymentCondition.java

@ -29,20 +29,23 @@ import org.springframework.web.context.WebApplicationContext;
* deployment. * deployment.
* *
* @author Madhura Bhave * @author Madhura Bhave
* @see ConditionalOnWarDeployment
* @see ConditionalOnNotWarDeployment
*/ */
class OnWarDeploymentCondition extends SpringBootCondition { class OnWarDeploymentCondition extends SpringBootCondition {
@Override @Override
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
boolean required = metadata.isAnnotated(ConditionalOnWarDeployment.class.getName());
ResourceLoader resourceLoader = context.getResourceLoader(); ResourceLoader resourceLoader = context.getResourceLoader();
if (resourceLoader instanceof WebApplicationContext) { if (resourceLoader instanceof WebApplicationContext) {
WebApplicationContext applicationContext = (WebApplicationContext) resourceLoader; WebApplicationContext applicationContext = (WebApplicationContext) resourceLoader;
ServletContext servletContext = applicationContext.getServletContext(); ServletContext servletContext = applicationContext.getServletContext();
if (servletContext != null) { if (servletContext != null) {
return ConditionOutcome.match("Application is deployed as a WAR file."); return new ConditionOutcome(required, "Application is deployed as a WAR file.");
} }
} }
return ConditionOutcome.noMatch(ConditionMessage.forCondition(ConditionalOnWarDeployment.class) return new ConditionOutcome(!required, ConditionMessage.forCondition(ConditionalOnWarDeployment.class)
.because("the application is not deployed as a WAR file.")); .because("the application is not deployed as a WAR file."));
} }

4
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2022 the original author or authors. * Copyright 2012-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -28,6 +28,7 @@ import reactor.netty.http.server.HttpServer;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWarDeployment;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
@ -43,6 +44,7 @@ import org.springframework.core.env.Environment;
* @since 2.0.0 * @since 2.0.0
*/ */
@AutoConfiguration @AutoConfiguration
@ConditionalOnNotWarDeployment
@ConditionalOnWebApplication @ConditionalOnWebApplication
@EnableConfigurationProperties(ServerProperties.class) @EnableConfigurationProperties(ServerProperties.class)
public class EmbeddedWebServerFactoryCustomizerAutoConfiguration { public class EmbeddedWebServerFactoryCustomizerAutoConfiguration {

77
spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnNotWarDeploymentTests.java

@ -0,0 +1,77 @@
/*
* Copyright 2012-2023 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.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.condition;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ConditionalOnNotWarDeployment @ConditionalOnNotWarDeployment}.
*
* @author Guirong Hu
*/
class ConditionalOnNotWarDeploymentTests {
@Test
void nonWebApplicationShouldMatch() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner();
contextRunner.withUserConfiguration(NotWarDeploymentConfiguration.class)
.run((context) -> assertThat(context).hasBean("notForWar"));
}
@Test
void reactiveWebApplicationShouldMatch() {
ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner();
contextRunner.withUserConfiguration(NotWarDeploymentConfiguration.class)
.run((context) -> assertThat(context).hasBean("notForWar"));
}
@Test
void embeddedServletWebApplicationShouldMatch() {
WebApplicationContextRunner contextRunner = new WebApplicationContextRunner(
AnnotationConfigServletWebApplicationContext::new);
contextRunner.withUserConfiguration(NotWarDeploymentConfiguration.class)
.run((context) -> assertThat(context).hasBean("notForWar"));
}
@Test
void warDeployedServletWebApplicationShouldNotMatch() {
WebApplicationContextRunner contextRunner = new WebApplicationContextRunner();
contextRunner.withUserConfiguration(NotWarDeploymentConfiguration.class)
.run((context) -> assertThat(context).doesNotHaveBean("notForWar"));
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnNotWarDeployment
static class NotWarDeploymentConfiguration {
@Bean
String notForWar() {
return "notForWar";
}
}
}

6
spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/developing-auto-configuration.adoc

@ -125,12 +125,12 @@ Resources can be specified by using the usual Spring conventions, as shown in th
[[features.developing-auto-configuration.condition-annotations.web-application-conditions]] [[features.developing-auto-configuration.condition-annotations.web-application-conditions]]
==== Web Application Conditions ==== Web Application Conditions
The `@ConditionalOnWebApplication` and `@ConditionalOnNotWebApplication` annotations let configuration be included depending on whether the application is a "`web application`". The `@ConditionalOnWebApplication` and `@ConditionalOnNotWebApplication` annotations let configuration be included depending on whether the application is a web application.
A servlet-based web application is any application that uses a Spring `WebApplicationContext`, defines a `session` scope, or has a `ConfigurableWebEnvironment`. A servlet-based web application is any application that uses a Spring `WebApplicationContext`, defines a `session` scope, or has a `ConfigurableWebEnvironment`.
A reactive web application is any application that uses a `ReactiveWebApplicationContext`, or has a `ConfigurableReactiveWebEnvironment`. A reactive web application is any application that uses a `ReactiveWebApplicationContext`, or has a `ConfigurableReactiveWebEnvironment`.
The `@ConditionalOnWarDeployment` annotation lets configuration be included depending on whether the application is a traditional WAR application that is deployed to a container. The `@ConditionalOnWarDeployment` and `@ConditionalOnNotWarDeployment` annotations let configuration be included depending on whether the application is a traditional WAR application that is deployed to a servlet container.
This condition will not match for applications that are run with an embedded server. This condition will not match for applications that are run with an embedded web server.

Loading…
Cancel
Save