Skip to content

Commit 196b1b6

Browse files
author
bnasslahsen
committed
Spring-boot 1, warning about bean creation - cache disabled. Fixes #689
1 parent 0529008 commit 196b1b6

File tree

2 files changed

+85
-36
lines changed

2 files changed

+85
-36
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.Optional;
27-
import java.util.stream.Collectors;
2827

2928
import com.fasterxml.jackson.databind.node.ObjectNode;
3029
import io.swagger.v3.core.converter.ModelConverter;
@@ -45,28 +44,21 @@
4544

4645
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
4746
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
48-
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
4947
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
5048
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
5149
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
5250
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
5351
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
54-
import org.springframework.boot.context.properties.bind.BindResult;
55-
import org.springframework.boot.context.properties.bind.Binder;
5652
import org.springframework.context.ApplicationContext;
5753
import org.springframework.context.annotation.Bean;
5854
import org.springframework.context.annotation.Conditional;
5955
import org.springframework.context.annotation.Configuration;
6056
import org.springframework.context.annotation.Lazy;
6157
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
62-
import org.springframework.core.env.Environment;
63-
import org.springframework.util.CollectionUtils;
6458

6559
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
66-
import static org.springdoc.core.Constants.SPRINGDOC_PREFIX;
6760
import static org.springdoc.core.Constants.SPRINGDOC_SCHEMA_RESOLVE_PROPERTIES;
6861
import static org.springdoc.core.SpringDocUtils.getConfig;
69-
import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
7062

7163
@Configuration
7264
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
@@ -192,41 +184,17 @@ OpenApiCustomiser propertiesResolverForSchema(PropertyResolverUtils propertyReso
192184
@Conditional(CacheOrGroupedOpenApiCondition.class)
193185
@ConditionalOnClass(name = BINDRESULT_CLASS)
194186
@Lazy(false)
195-
BeanFactoryPostProcessor springdocBeanFactoryPostProcessor(Environment environment) {
196-
return beanFactory -> {
197-
final BindResult<SpringDocConfigProperties> result = Binder.get(environment)
198-
.bind(SPRINGDOC_PREFIX, SpringDocConfigProperties.class);
199-
if (result.isBound()) {
200-
SpringDocConfigProperties springDocGroupConfig = result.get();
201-
List<GroupedOpenApi> groupedOpenApis = springDocGroupConfig.getGroupConfigs().stream()
202-
.map(elt -> {
203-
GroupedOpenApi.Builder builder = GroupedOpenApi.builder();
204-
if (!CollectionUtils.isEmpty(elt.getPackagesToScan()))
205-
builder.packagesToScan(elt.getPackagesToScan().toArray(new String[0]));
206-
if (!CollectionUtils.isEmpty(elt.getPathsToMatch()))
207-
builder.pathsToMatch(elt.getPathsToMatch().toArray(new String[0]));
208-
return builder.setGroup(elt.getGroup()).build();
209-
})
210-
.collect(Collectors.toList());
211-
groupedOpenApis.forEach(elt -> beanFactory.registerSingleton(elt.getGroup(), elt));
212-
}
213-
initBeanFactoryPostProcessor(beanFactory);
214-
};
187+
static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor() {
188+
return new SpringdocBeanFactoryConfigurer();
215189
}
216190

217191
// For spring-boot-1 compatibility
218192
@Bean
219193
@Conditional(CacheOrGroupedOpenApiCondition.class)
220194
@ConditionalOnMissingClass(value = BINDRESULT_CLASS)
221195
@Lazy(false)
222-
BeanFactoryPostProcessor springdocBeanFactoryPostProcessor2(Environment environment) {
223-
return this::initBeanFactoryPostProcessor;
196+
static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor2() {
197+
return beanFactory -> SpringdocBeanFactoryConfigurer.initBeanFactoryPostProcessor(beanFactory);
224198
}
225199

226-
private void initBeanFactoryPostProcessor(ConfigurableListableBeanFactory beanFactory) {
227-
for (String beanName : beanFactory.getBeanNamesForType(OpenAPIBuilder.class))
228-
beanFactory.getBeanDefinition(beanName).setScope(SCOPE_PROTOTYPE);
229-
for (String beanName : beanFactory.getBeanNamesForType(OpenAPI.class))
230-
beanFactory.getBeanDefinition(beanName).setScope(SCOPE_PROTOTYPE);
231-
}
232200
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
*
3+
* *
4+
* * *
5+
* * * * Copyright 2019-2020 the original author or authors.
6+
* * * *
7+
* * * * Licensed under the Apache License, Version 2.0 (the "License");
8+
* * * * you may not use this file except in compliance with the License.
9+
* * * * You may obtain a copy of the License at
10+
* * * *
11+
* * * * https://www.apache.org/licenses/LICENSE-2.0
12+
* * * *
13+
* * * * Unless required by applicable law or agreed to in writing, software
14+
* * * * distributed under the License is distributed on an "AS IS" BASIS,
15+
* * * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* * * * See the License for the specific language governing permissions and
17+
* * * * limitations under the License.
18+
* * *
19+
* *
20+
*
21+
*
22+
*/
23+
24+
package org.springdoc.core;
25+
26+
import java.util.List;
27+
import java.util.stream.Collectors;
28+
29+
import io.swagger.v3.oas.models.OpenAPI;
30+
31+
import org.springframework.beans.BeansException;
32+
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
33+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
34+
import org.springframework.boot.context.properties.bind.BindResult;
35+
import org.springframework.boot.context.properties.bind.Binder;
36+
import org.springframework.context.EnvironmentAware;
37+
import org.springframework.core.env.Environment;
38+
import org.springframework.lang.Nullable;
39+
import org.springframework.util.CollectionUtils;
40+
41+
import static org.springdoc.core.Constants.SPRINGDOC_PREFIX;
42+
import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;
43+
44+
public class SpringdocBeanFactoryConfigurer implements EnvironmentAware, BeanFactoryPostProcessor {
45+
46+
@Nullable
47+
private Environment environment;
48+
49+
@Override
50+
public void setEnvironment(Environment environment) {
51+
this.environment = environment;
52+
}
53+
54+
@Override
55+
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
56+
final BindResult<SpringDocConfigProperties> result = Binder.get(environment)
57+
.bind(SPRINGDOC_PREFIX, SpringDocConfigProperties.class);
58+
if (result.isBound()) {
59+
SpringDocConfigProperties springDocGroupConfig = result.get();
60+
List<GroupedOpenApi> groupedOpenApis = springDocGroupConfig.getGroupConfigs().stream()
61+
.map(elt -> {
62+
GroupedOpenApi.Builder builder = GroupedOpenApi.builder();
63+
if (!CollectionUtils.isEmpty(elt.getPackagesToScan()))
64+
builder.packagesToScan(elt.getPackagesToScan().toArray(new String[0]));
65+
if (!CollectionUtils.isEmpty(elt.getPathsToMatch()))
66+
builder.pathsToMatch(elt.getPathsToMatch().toArray(new String[0]));
67+
return builder.setGroup(elt.getGroup()).build();
68+
})
69+
.collect(Collectors.toList());
70+
groupedOpenApis.forEach(elt -> beanFactory.registerSingleton(elt.getGroup(), elt));
71+
}
72+
initBeanFactoryPostProcessor(beanFactory);
73+
}
74+
75+
public static void initBeanFactoryPostProcessor(ConfigurableListableBeanFactory beanFactory) {
76+
for (String beanName : beanFactory.getBeanNamesForType(OpenAPIBuilder.class))
77+
beanFactory.getBeanDefinition(beanName).setScope(SCOPE_PROTOTYPE);
78+
for (String beanName : beanFactory.getBeanNamesForType(OpenAPI.class))
79+
beanFactory.getBeanDefinition(beanName).setScope(SCOPE_PROTOTYPE);
80+
}
81+
}

0 commit comments

Comments
 (0)