Do not fail if "spring.datasource.url" cannot be resolved
Previously, a condition checked the value of "spring.datasource.url" to determine if an embedded database has to be created as a fallback. When the value is set with an unresolved placeholder, this fails even if the DataSource is going to created by another mean ultimately. This commit makes a more conservative check by only checking the presence of the property rather than its value. Closes gh-20438
This commit is contained in:
		
							parent
							
								
									9a5ffb7e0c
								
							
						
					
					
						commit
						18353231a0
					
				|  | @ -38,7 +38,6 @@ import org.springframework.context.annotation.Configuration; | |||
| import org.springframework.context.annotation.Import; | ||||
| import org.springframework.core.type.AnnotatedTypeMetadata; | ||||
| import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; | ||||
| import org.springframework.util.StringUtils; | ||||
| 
 | ||||
| /** | ||||
|  * {@link EnableAutoConfiguration Auto-configuration} for {@link DataSource}. | ||||
|  | @ -129,14 +128,16 @@ public class DataSourceAutoConfiguration { | |||
| 	 */ | ||||
| 	static class EmbeddedDatabaseCondition extends SpringBootCondition { | ||||
| 
 | ||||
| 		private static final String DATASOURCE_URL_PROPERTY = "spring.datasource.url"; | ||||
| 
 | ||||
| 		private final SpringBootCondition pooledCondition = new PooledDataSourceCondition(); | ||||
| 
 | ||||
| 		@Override | ||||
| 		public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { | ||||
| 			ConditionMessage.Builder message = ConditionMessage.forCondition("EmbeddedDataSource"); | ||||
| 			String url = context.getEnvironment().getProperty("spring.datasource.url"); | ||||
| 			if (StringUtils.hasText(url)) { | ||||
| 				return ConditionOutcome.noMatch(message.found("explicit url").items(url)); | ||||
| 			boolean hasDatasourceUrl = context.getEnvironment().containsProperty(DATASOURCE_URL_PROPERTY); | ||||
| 			if (hasDatasourceUrl) { | ||||
| 				return ConditionOutcome.noMatch(message.because(DATASOURCE_URL_PROPERTY + " is set")); | ||||
| 			} | ||||
| 			if (anyMatches(context, metadata, this.pooledCondition)) { | ||||
| 				return ConditionOutcome.noMatch(message.foundExactly("supported pooled data source")); | ||||
|  |  | |||
|  | @ -194,6 +194,13 @@ public class DataSourceAutoConfigurationTests { | |||
| 				.run((context) -> assertThat(context).getBean(DataSource.class).isInstanceOf(BasicDataSource.class)); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	public void whenThereIsAUserProvidedDataSourceAnUnresolvablePlaceholderDoesNotCauseAProblem() { | ||||
| 		this.contextRunner.withUserConfiguration(TestDataSourceConfiguration.class) | ||||
| 				.withPropertyValues("spring.datasource.url:${UNRESOLVABLE_PLACEHOLDER}") | ||||
| 				.run((context) -> assertThat(context).getBean(DataSource.class).isInstanceOf(BasicDataSource.class)); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	public void testDataSourceIsInitializedEarly() { | ||||
| 		this.contextRunner.withUserConfiguration(TestInitializedDataSourceConfiguration.class) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue