Skip to content

Commit cb758b7

Browse files
author
bnasslahsen
committed
lazy initialization bug. Fixes #873.
1 parent 8c1e3d5 commit cb758b7

File tree

29 files changed

+88
-11
lines changed

29 files changed

+88
-11
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2727
import org.springframework.boot.context.properties.ConfigurationProperties;
2828
import org.springframework.context.annotation.Configuration;
29+
import org.springframework.context.annotation.Lazy;
2930
import org.springframework.http.MediaType;
3031

3132
import static org.springdoc.core.Constants.DEFAULT_WEB_JARS_PREFIX_URL;
@@ -35,6 +36,7 @@
3536
* The type Spring doc config properties.
3637
* @author bnasslahsen
3738
*/
39+
@Lazy(false)
3840
@Configuration(proxyBeanMethods = false)
3941
@ConfigurationProperties(prefix = Constants.SPRINGDOC_PREFIX)
4042
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
* The type Spring doc configuration.
7777
* @author bnasslahsen
7878
*/
79+
@Lazy(false)
7980
@Configuration(proxyBeanMethods = false)
8081
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
8182
public class SpringDocConfiguration {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3535
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3636
import org.springframework.context.annotation.Configuration;
37+
import org.springframework.context.annotation.Lazy;
3738
import org.springframework.util.CollectionUtils;
3839

3940
import static org.springdoc.core.Constants.SPRINGDOC_SWAGGER_UI_ENABLED;
@@ -44,6 +45,7 @@
4445
* The type Swagger ui config parameters.
4546
* @author bnasslahsen
4647
*/
48+
@Lazy(false)
4749
@Configuration(proxyBeanMethods = false)
4850
@ConditionalOnProperty(name = SPRINGDOC_SWAGGER_UI_ENABLED, matchIfMissing = true)
4951
@ConditionalOnBean(SpringDocConfiguration.class)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2525
import org.springframework.boot.context.properties.ConfigurationProperties;
2626
import org.springframework.context.annotation.Configuration;
27+
import org.springframework.context.annotation.Lazy;
2728

2829
import static org.springdoc.core.Constants.SPRINGDOC_SWAGGER_UI_ENABLED;
2930

@@ -32,6 +33,7 @@
3233
* The type Swagger ui config properties.
3334
* @author bnasslahsen
3435
*/
36+
@Lazy(false)
3537
@Configuration(proxyBeanMethods = false)
3638
@ConfigurationProperties(prefix = "springdoc.swagger-ui")
3739
@ConditionalOnProperty(name = SPRINGDOC_SWAGGER_UI_ENABLED, matchIfMissing = true)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3030
import org.springframework.boot.context.properties.ConfigurationProperties;
3131
import org.springframework.context.annotation.Configuration;
32+
import org.springframework.context.annotation.Lazy;
3233
import org.springframework.util.CollectionUtils;
3334

3435
import static org.springdoc.core.Constants.SPRINGDOC_SWAGGER_UI_ENABLED;
@@ -39,6 +40,7 @@
3940
* to get the idea what each parameter does.
4041
* @author bnasslahsen
4142
*/
43+
@Lazy(false)
4244
@Configuration(proxyBeanMethods = false)
4345
@ConfigurationProperties(prefix = "springdoc.swagger-ui.oauth")
4446
@ConditionalOnProperty(name = SPRINGDOC_SWAGGER_UI_ENABLED, matchIfMissing = true)

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/SpringDocDataRestConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
* The type Spring doc data rest configuration.
7676
* @author bnasslahsen
7777
*/
78+
@Lazy(false)
7879
@Configuration(proxyBeanMethods = false)
7980
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
8081
public class SpringDocDataRestConfiguration {
@@ -143,6 +144,7 @@ QuerydslPredicateOperationCustomizer queryDslQuerydslPredicateOperationCustomize
143144
* The type Spring repository rest resource provider configuration.
144145
* @author bnasslahsen
145146
*/
147+
@Lazy(false)
146148
@Configuration(proxyBeanMethods = false)
147149
@ConditionalOnClass(RepositoryRestHandlerMapping.class)
148150
static class SpringRepositoryRestResourceProviderConfiguration {

springdoc-openapi-data-rest/src/test/resources/application-test.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# * limitations under the License.
1616
# */
1717
#
18-
spring.main.banner-mode="off"
18+
spring.main.banner-mode=off
1919
logging.level.root=ERROR
2020
logging.level.test.org.springdoc.api=ERROR
2121
spring.main.lazy-initialization=true

springdoc-openapi-groovy/src/main/java/org/springdoc/groovy/SpringDocGroovyConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
* The type Spring doc groovy configuration.
3434
* @author bnasslahsen
3535
*/
36+
@Lazy(false)
3637
@Configuration(proxyBeanMethods = false)
3738
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
3839
public class SpringDocGroovyConfiguration {

springdoc-openapi-groovy/src/test/resources/application-test.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@
1616
# */
1717
#
1818
spring.main.banner-mode:"off"
19-
logging.level.root=OFF
19+
logging.level.root=OFF
20+
spring.main.lazy-initialization=true

springdoc-openapi-hateoas/src/main/java/org/springdoc/hateoas/SpringDocHateoasConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
* The type Spring doc hateoas configuration.
4949
* @author bnasslahsen
5050
*/
51+
@Lazy(false)
5152
@Configuration(proxyBeanMethods = false)
5253
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
5354
@ConditionalOnClass(LinkRelationProvider.class)

springdoc-openapi-hateoas/src/test/java/test/org/springdoc/api/app6/SpringDocApp6Test.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@
1818

1919
package test.org.springdoc.api.app6;
2020

21+
import java.lang.reflect.Field;
22+
import java.util.HashMap;
23+
import java.util.Iterator;
24+
import java.util.Map;
25+
import java.util.Map.Entry;
26+
27+
import com.fasterxml.jackson.databind.ObjectMapper;
28+
import com.fasterxml.jackson.databind.introspect.SimpleMixInResolver;
29+
import com.fasterxml.jackson.databind.type.ClassKey;
30+
import io.swagger.v3.core.util.Json;
31+
import org.apache.commons.lang3.reflect.FieldUtils;
32+
import org.junit.jupiter.api.AfterEach;
33+
import org.junit.jupiter.api.BeforeEach;
2134
import test.org.springdoc.api.AbstractSpringDocTest;
2235

2336
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -30,5 +43,33 @@ public class SpringDocApp6Test extends AbstractSpringDocTest {
3043
static class SpringDocTestApp {
3144
}
3245

46+
private Map<ClassKey, Class<?>> springMixins = new HashMap<>();
47+
48+
@BeforeEach
49+
void init() throws IllegalAccessException {
50+
Field convertersField2 = FieldUtils.getDeclaredField(ObjectMapper.class, "_mixIns", true);
51+
SimpleMixInResolver _mixIns = (SimpleMixInResolver) convertersField2.get(Json.mapper());
52+
Field convertersField3 = FieldUtils.getDeclaredField(SimpleMixInResolver.class, "_localMixIns", true);
53+
Map<ClassKey, Class<?>> _localMixIns = (Map<ClassKey, Class<?>>) convertersField3.get(_mixIns);
54+
Iterator<Entry<ClassKey, Class<?>>> it = _localMixIns.entrySet().iterator();
55+
while (it.hasNext()) {
56+
Map.Entry<ClassKey, Class<?>> entry = it.next();
57+
if (entry.getKey().toString().startsWith("org.springframework")) {
58+
springMixins.put(entry.getKey(), entry.getValue());
59+
it.remove();
60+
}
61+
}
62+
63+
}
64+
65+
@AfterEach
66+
private void clean() throws IllegalAccessException {
67+
Field convertersField2 = FieldUtils.getDeclaredField(ObjectMapper.class, "_mixIns", true);
68+
SimpleMixInResolver _mixIns = (SimpleMixInResolver) convertersField2.get(Json.mapper());
69+
Field convertersField3 = FieldUtils.getDeclaredField(SimpleMixInResolver.class, "_localMixIns", true);
70+
Map<ClassKey, Class<?>> _localMixIns = (Map<ClassKey, Class<?>>) convertersField3.get(_mixIns);
71+
_localMixIns.putAll(springMixins);
72+
}
73+
3374

3475
}

springdoc-openapi-hateoas/src/test/resources/application-test.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# * limitations under the License.
1616
# */
1717
#
18-
spring.main.banner-mode="off"
18+
spring.main.banner-mode=off
1919
logging.level.root=ERROR
2020
logging.level.test.org.springdoc.api=ERROR
2121
spring.main.lazy-initialization=true

springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
* The type Spring doc kotlin configuration.
3939
* @author bnasslahsen
4040
*/
41+
@Lazy(false)
4142
@Configuration(proxyBeanMethods = false)
4243
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
4344
public class SpringDocKotlinConfiguration {

springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinxConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2727
import org.springframework.context.annotation.Configuration;
28+
import org.springframework.context.annotation.Lazy;
2829

2930
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
3031
import static org.springdoc.core.SpringDocUtils.getConfig;
@@ -33,6 +34,7 @@
3334
* The type Spring doc kotlinx configuration.
3435
* @author bnasslahsen
3536
*/
37+
@Lazy(false)
3638
@ConditionalOnClass(Flow.class)
3739
@Configuration(proxyBeanMethods = false)
3840
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
spring:
22
main:
3-
banner-mode: "off"
3+
banner-mode: "off"
4+
lazy-initialization: true

springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityConfiguration.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3939
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
4040
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
41+
import org.springframework.context.ApplicationContext;
4142
import org.springframework.context.annotation.Bean;
4243
import org.springframework.context.annotation.Configuration;
4344
import org.springframework.context.annotation.Lazy;
@@ -48,6 +49,7 @@
4849
import org.springframework.security.web.FilterChainProxy;
4950
import org.springframework.security.web.SecurityFilterChain;
5051
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
52+
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
5153

5254
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
5355
import static org.springdoc.core.Constants.SPRINGDOC_SHOW_LOGIN_ENDPOINT;
@@ -57,6 +59,7 @@
5759
* The type Spring doc security configuration.
5860
* @author bnasslahsen
5961
*/
62+
@Lazy(false)
6063
@Configuration(proxyBeanMethods = false)
6164
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
6265
public class SpringDocSecurityConfiguration {
@@ -71,6 +74,7 @@ public class SpringDocSecurityConfiguration {
7174
* The type Spring security o auth 2 provider configuration.
7275
* @author bnasslahsen
7376
*/
77+
@Lazy(false)
7478
@Configuration(proxyBeanMethods = false)
7579
@ConditionalOnBean(FrameworkEndpointHandlerMapping.class)
7680
class SpringSecurityOAuth2ProviderConfiguration {
@@ -87,14 +91,16 @@ SpringSecurityOAuth2Provider springSecurityOAuth2Provider(FrameworkEndpointHandl
8791
}
8892
}
8993

94+
@Lazy(false)
9095
@Configuration(proxyBeanMethods = false)
9196
@ConditionalOnClass(javax.servlet.Filter.class)
9297
class SpringSecurityLoginEndpointConfiguration {
9398

9499
@Bean
95100
@ConditionalOnProperty(SPRINGDOC_SHOW_LOGIN_ENDPOINT)
96101
@Lazy(false)
97-
OpenApiCustomiser springSecurityLoginEndpointCustomiser(FilterChainProxy filterChainProxy) {
102+
OpenApiCustomiser springSecurityLoginEndpointCustomiser(ApplicationContext applicationContext) {
103+
FilterChainProxy filterChainProxy = applicationContext.getBean(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME, FilterChainProxy.class);
98104
return openAPI -> {
99105
for (SecurityFilterChain filterChain : filterChainProxy.getFilterChains()) {
100106
Optional<UsernamePasswordAuthenticationFilter> optionalFilter =

springdoc-openapi-security/src/test/java/test/org/springdoc/api/app6/SpringDocApp6Test.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ static class SpringDocTestApp {
3434
MyUserDetailsService userDetailsService() {
3535
return new MyUserDetailsService();
3636
}
37-
3837
}
3938

4039
}

springdoc-openapi-security/src/test/resources/application-test.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@
1515
# * limitations under the License.
1616
# */
1717
#
18-
spring.main.banner-mode:"off"
19-
logging.level.root=OFF
18+
spring.main.banner-mode=off
19+
logging.level.root=OFF
20+
spring.main.lazy-initialization=true

springdoc-openapi-ui/src/main/java/org/springdoc/webmvc/ui/SwaggerConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.context.annotation.Configuration;
35+
import org.springframework.context.annotation.Lazy;
3536

3637
import static org.springdoc.core.Constants.SPRINGDOC_SWAGGER_UI_ENABLED;
3738

@@ -40,6 +41,7 @@
4041
* The type Swagger config.
4142
* @author bnasslahsen
4243
*/
44+
@Lazy(false)
4345
@Configuration(proxyBeanMethods = false)
4446
@ConditionalOnProperty(name = SPRINGDOC_SWAGGER_UI_ENABLED, matchIfMissing = true)
4547
@ConditionalOnBean(SpringDocConfiguration.class)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
spring:
22
main:
33
banner-mode: "off"
4+
lazy-initialization: true
45
autoconfigure:
56
exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/MultipleOpenApiWebFluxConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
* The type Multiple open api web flux configuration.
5151
* @author bnasslahsen
5252
*/
53+
@Lazy(false)
5354
@Configuration(proxyBeanMethods = false)
5455
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
5556
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/SpringDocWebFluxConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
* The type Spring doc web flux configuration.
6464
* @author bnasslahsen
6565
*/
66+
@Lazy(false)
6667
@Configuration(proxyBeanMethods = false)
6768
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
6869
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)

springdoc-openapi-webflux-core/src/test/resources/application-test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
spring:
22
main:
33
banner-mode: "off"
4+
lazy-initialization: true
45
logging:
56
level:
67
root: OFF

springdoc-openapi-webflux-ui/src/main/java/org/springdoc/webflux/ui/SwaggerConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3333
import org.springframework.context.annotation.Bean;
3434
import org.springframework.context.annotation.Configuration;
35+
import org.springframework.context.annotation.Lazy;
3536
import org.springframework.web.reactive.config.WebFluxConfigurer;
3637

3738
import static org.springdoc.core.Constants.SPRINGDOC_SWAGGER_UI_ENABLED;
@@ -41,6 +42,7 @@
4142
* The type Swagger config.
4243
* @author bnasslahsen
4344
*/
45+
@Lazy(false)
4446
@Configuration(proxyBeanMethods = false)
4547
@ConditionalOnProperty(name = SPRINGDOC_SWAGGER_UI_ENABLED, matchIfMissing = true)
4648
@ConditionalOnBean(SpringDocConfiguration.class)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
spring.main.banner-mode=off
2+
spring.main.lazy-initialization=true

springdoc-openapi-webflux-ui/src/test/resources/application-test.yml

Lines changed: 0 additions & 1 deletion
This file was deleted.

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/MultipleOpenApiSupportConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
* The type Multiple open api support configuration.
5454
* @author bnasslahsen
5555
*/
56+
@Lazy(false)
5657
@Configuration(proxyBeanMethods = false)
5758
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
5859
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
* The type Spring doc web mvc configuration.
6969
* @author bnasslahsen
7070
*/
71+
@Lazy(false)
7172
@Configuration(proxyBeanMethods = false)
7273
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
7374
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)

springdoc-openapi-webmvc-core/src/test/resources/application-test.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@
1515
# * limitations under the License.
1616
# */
1717
#
18-
spring.main.banner-mode:"off"
19-
logging.level.root=OFF
18+
spring.main.banner-mode=off
19+
logging.level.root=OFF
20+
spring.main.lazy-initialization=true

0 commit comments

Comments
 (0)