The springfox-swagger parameter is an infinite recursive solution for objects

1. Background

  • In the interface parameter receiving entity class, add a field to receive nested json parameters. For convenience, the type of this field is another entity class. In the usual development process, this is not the case. problem, and it can save a lot of tedious operations of obtaining values.

2. An error occurs when the project is run

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.StackOverflowError
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:176)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:350)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:149)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:112)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:880)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:146)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:545)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
at com.ttpai.microservice.schedule.server.ScheduleApplication.main(ScheduleApplication.java:44)
Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.StackOverflowError
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2212)
at com.google.common.cache.LocalCache.get(LocalCache.java:4053)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4057)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4986)
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4992)
at springfox.documentation.spring.web.scanners.CachingOperationReader.read(CachingOperationReader.java:57)
at springfox.documentation.spring.web.scanners.ApiDescriptionReader.read(ApiDescriptionReader.java:66)
at springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:89)
at springfox.documentation.spring.web.scanners.ApiDocumentationScanner.scan(ApiDocumentationScanner.java:70)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.scanDocumentation(DocumentationPluginsBootstrapper.java:85)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:127)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173)
... 14 common frames omitted
Caused by: java.lang.StackOverflowError: null
at com.fasterxml.classmate.util.ResolvedTypeCache$Key.<init>(ResolvedTypeCache.java:110)
at com.fasterxml.classmate.util.ResolvedTypeCache$Key.<init>(ResolvedTypeCache.java:99)
at com.fasterxml.classmate.util.ResolvedTypeCache.key(ResolvedTypeCache.java:37)
at com.fasterxml.classmate.TypeResolver._fromClass(TypeResolver.java:360)
at com.fasterxml.classmate.TypeResolver._fromAny(TypeResolver.java:312)
at com.fasterxml.classmate.TypeResolver._fromParamType(TypeResolver.java:466)
at com.fasterxml.classmate.TypeResolver._fromAny(TypeResolver.java:315)
at com.fasterxml.classmate.TypeResolver.resolve(TypeResolver.java:174)
at com.fasterxml.classmate.ResolvedTypeWithMembers.resolveField(ResolvedTypeWithMembers.java:551)
at com.fasterxml.classmate.ResolvedTypeWithMembers.resolveMemberFields(ResolvedTypeWithMembers.java:300)
at com.fasterxml.classmate.ResolvedTypeWithMembers.getMemberFields(ResolvedTypeWithMembers.java:193)
at springfox.documentation.schema.property.field.FieldProvider.in(FieldProvider.java:47)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:80)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)
at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110)

Baidu looked at it and found that infinite recursion occurred. After checking, it was indeed found that the entity class of this field type also had fields whose type was this entity class, so there was mutual dependence, and infinite recursion occurred.

3. Solution

  • Because the received value is json, you can just use map to receive it. There should be other better solutions. Didn’t delve into it. . .

For details, please refer to springfox-swagger. The parameter is an infinite recursive solution for objects.