Skip to content

Commit c28bf4d

Browse files
committed
- NoSuchCacheManagerFailureAnalyzer - analyzer for 'CacheManager' is not found/not unique.
- AbstractNoSuchBeanDefinitionFailureAnalyzer - provides a basic implementation to inspect `not matches` auto-configurations and registered beans. - AbstractNoUniqueBeanDefinitionFailureAnalyzer - provides a basic implementation to inspect registered beans.
1 parent 9686ae4 commit c28bf4d

File tree

15 files changed

+1364
-430
lines changed

15 files changed

+1364
-430
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfiguration.java

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.autoconfigure.cache;
1818

19+
import java.util.Map;
20+
import java.util.Set;
1921
import java.util.stream.Collectors;
2022

2123
import org.springframework.beans.factory.InitializingBean;
@@ -42,7 +44,8 @@
4244
import org.springframework.core.type.AnnotationMetadata;
4345
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
4446
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
45-
import org.springframework.util.Assert;
47+
import org.springframework.util.CollectionUtils;
48+
import org.springframework.util.StringUtils;
4649

4750
/**
4851
* {@link EnableAutoConfiguration Auto-configuration} for the cache abstraction. Creates a
@@ -74,8 +77,9 @@ public CacheManagerCustomizers cacheManagerCustomizers(
7477

7578
@Bean
7679
public CacheManagerValidator cacheAutoConfigurationValidator(
77-
CacheProperties cacheProperties, ObjectProvider<CacheManager> cacheManager) {
78-
return new CacheManagerValidator(cacheProperties, cacheManager);
80+
CacheProperties cacheProperties,
81+
ObjectProvider<Map<String, CacheManager>> cacheManagers) {
82+
return new CacheManagerValidator(cacheProperties, cacheManagers);
7983
}
8084

8185
@Configuration
@@ -91,27 +95,29 @@ public CacheManagerJpaDependencyConfiguration() {
9195
}
9296

9397
/**
94-
* Bean used to validate that a CacheManager exists and provide a more meaningful
95-
* exception.
98+
* Bean used to validate that a CacheManager exists and it unique.
9699
*/
97100
static class CacheManagerValidator implements InitializingBean {
98101

99102
private final CacheProperties cacheProperties;
100103

101-
private final ObjectProvider<CacheManager> cacheManager;
104+
private final Map<String, CacheManager> cacheManagers;
102105

103106
CacheManagerValidator(CacheProperties cacheProperties,
104-
ObjectProvider<CacheManager> cacheManager) {
107+
ObjectProvider<Map<String, CacheManager>> cacheManagers) {
105108
this.cacheProperties = cacheProperties;
106-
this.cacheManager = cacheManager;
109+
this.cacheManagers = cacheManagers.getIfAvailable();
107110
}
108111

109112
@Override
110113
public void afterPropertiesSet() {
111-
Assert.notNull(this.cacheManager.getIfAvailable(),
112-
() -> "No cache manager could "
113-
+ "be auto-configured, check your configuration (caching "
114-
+ "type is '" + this.cacheProperties.getType() + "')");
114+
if (CollectionUtils.isEmpty(this.cacheManagers)) {
115+
throw new NoSuchCacheManagerException(this.cacheProperties);
116+
}
117+
if (this.cacheManagers.size() > 1) {
118+
throw new NoUniqueCacheManagerException(this.cacheManagers.keySet(),
119+
this.cacheProperties);
120+
}
115121
}
116122

117123
}
@@ -133,4 +139,52 @@ public String[] selectImports(AnnotationMetadata importingClassMetadata) {
133139

134140
}
135141

142+
/**
143+
* Exception thrown when {@link org.springframework.cache.CacheManager} implementation
144+
* are not specified.
145+
*/
146+
static class NoSuchCacheManagerException extends RuntimeException {
147+
148+
private final CacheProperties properties;
149+
150+
NoSuchCacheManagerException(CacheProperties properties) {
151+
super(String.format("No qualifying bean of type '%s' available",
152+
CacheManager.class.getName()));
153+
this.properties = properties;
154+
}
155+
156+
NoSuchCacheManagerException(String message, CacheProperties properties) {
157+
super(message);
158+
this.properties = properties;
159+
}
160+
161+
CacheProperties getProperties() {
162+
return this.properties;
163+
}
164+
165+
}
166+
167+
/**
168+
* Exception thrown when multiple {@link org.springframework.cache.CacheManager}
169+
* implementations are available with no way to know which implementation should be
170+
* used.
171+
*/
172+
static class NoUniqueCacheManagerException extends NoSuchCacheManagerException {
173+
174+
private final Set<String> beanNames;
175+
176+
NoUniqueCacheManagerException(Set<String> beanNames, CacheProperties properties) {
177+
super(String.format(
178+
"expected single matching bean of type '%s' but found " + "%d: %s",
179+
CacheManager.class.getName(), beanNames.size(),
180+
StringUtils.collectionToCommaDelimitedString(beanNames)), properties);
181+
this.beanNames = beanNames;
182+
}
183+
184+
Set<String> getBeanNames() {
185+
return this.beanNames;
186+
}
187+
188+
}
189+
136190
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Copyright 2012-2018 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.cache;
18+
19+
import java.util.Collection;
20+
21+
import org.springframework.beans.BeansException;
22+
import org.springframework.beans.factory.BeanFactory;
23+
import org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzerSupport;
24+
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
25+
import org.springframework.boot.diagnostics.FailureAnalysis;
26+
import org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzerSupport;
27+
import org.springframework.cache.CacheManager;
28+
29+
/**
30+
* An {@link AbstractFailureAnalyzer} for
31+
* {@link CacheAutoConfiguration.NoSuchCacheManagerException}.
32+
*
33+
* @author Dmytro Nosan
34+
*/
35+
class NoSuchCacheManagerFailureAnalyzer extends
36+
NoSuchBeanDefinitionFailureAnalyzerSupport<CacheAutoConfiguration.NoSuchCacheManagerException> {
37+
38+
private final NoUniqueCacheManagerFailureAnalyzer analyzer = new NoUniqueCacheManagerFailureAnalyzer();
39+
40+
@Override
41+
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
42+
super.setBeanFactory(beanFactory);
43+
this.analyzer.setBeanFactory(beanFactory);
44+
}
45+
46+
@Override
47+
public FailureAnalysis analyze(Throwable failure) {
48+
FailureAnalysis analyze = this.analyzer.analyze(failure);
49+
if (analyze != null) {
50+
return analyze;
51+
}
52+
return super.analyze(failure);
53+
}
54+
55+
@Override
56+
protected BeanMetadata getBeanMetadata(Throwable rootFailure,
57+
CacheAutoConfiguration.NoSuchCacheManagerException cause) {
58+
return new BeanMetadata(CacheManager.class);
59+
}
60+
61+
private static final class NoUniqueCacheManagerFailureAnalyzer extends
62+
NoUniqueBeanDefinitionFailureAnalyzerSupport<CacheAutoConfiguration.NoUniqueCacheManagerException> {
63+
64+
@Override
65+
protected Collection<String> getBeanNames(Throwable rootFailure,
66+
CacheAutoConfiguration.NoUniqueCacheManagerException cause) {
67+
return cause.getBeanNames();
68+
}
69+
70+
}
71+
72+
}

0 commit comments

Comments
 (0)