Skip to content

springdoc 3.0 doesn't work well with spring boot 4.0 #3157

@Yanwensiyi

Description

@Yanwensiyi

Describe the bug
I'm using springdoc 3.0 with spring boot 4.0.0, while it threw an exception when I opening the swagger ui web page.
The stacktrace is shown below:

java.lang.IllegalArgumentException: Conflicting setter definitions for property "all": tools.jackson.databind.node.ObjectNode#setAll(java.util.Map) vs tools.jackson.databind.node.ObjectNode#setAll(tools.jackson.databind.node.ObjectNode)
at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder._selectSetterFromMultiple(POJOPropertyBuilder.java:561) ~[jackson-databind-2.19.2.jar:2.19.2]
at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:492) ~[jackson-databind-2.19.2.jar:2.19.2]
at org.springdoc.core.converters.PolymorphicModelConverter$BeanPropertyBiDefinition.getAnyAnnotation(PolymorphicModelConverter.java:322) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.converters.PolymorphicModelConverter$BeanPropertyBiDefinition.getAnyAnnotation(PolymorphicModelConverter.java:269) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.converters.PolymorphicModelConverter$BeanPropertyBiDefinition.isAnyAnnotated(PolymorphicModelConverter.java:284) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.converters.PolymorphicModelConverter.resolve(PolymorphicModelConverter.java:128) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.customizers.KotlinDeprecatedPropertyCustomizer.resolve(KotlinDeprecatedPropertyCustomizer.kt:55) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.converters.KotlinInlineClassUnwrappingConverter.resolve(KotlinInlineClassUnwrappingConverter.kt:42) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.converters.PageableOpenAPIConverter.resolve(PageableOpenAPIConverter.java:97) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.converters.PageOpenAPIConverter.resolve(PageOpenAPIConverter.java:102) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.converters.SortOpenAPIConverter.resolve(SortOpenAPIConverter.java:92) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at io.swagger.v3.core.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:97) ~[swagger-core-jakarta-2.2.38.jar:2.2.38]
at org.springdoc.core.utils.SpringDocAnnotationsUtils.resolveAsResolvedSchema(SpringDocAnnotationsUtils.java:538) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.utils.SpringDocAnnotationsUtils.extractSchema(SpringDocAnnotationsUtils.java:151) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.service.GenericResponseService.calculateSchema(GenericResponseService.java:579) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.service.GenericResponseService.buildContent(GenericResponseService.java:557) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.service.GenericResponseService.buildContent(GenericResponseService.java:538) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.service.GenericResponseService.buildApiResponses(GenericResponseService.java:611) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.service.GenericResponseService.buildApiResponses(GenericResponseService.java:492) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.core.service.GenericResponseService.build(GenericResponseService.java:268) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:643) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:835) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$13(OpenApiResource.java:234) ~[springdoc-openapi-starter-webmvc-api-3.0.0.jar:3.0.0]
at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na]
at org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:210) ~[springdoc-openapi-starter-webmvc-api-3.0.0.jar:3.0.0]
at org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$4(OpenApiResource.java:180) ~[springdoc-openapi-starter-webmvc-api-3.0.0.jar:3.0.0]
at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na]
at org.springdoc.webmvc.api.OpenApiResource.getPaths(OpenApiResource.java:154) ~[springdoc-openapi-starter-webmvc-api-3.0.0.jar:3.0.0]
at org.springdoc.api.AbstractOpenApiResource.getOpenApi(AbstractOpenApiResource.java:388) ~[springdoc-openapi-starter-common-3.0.0.jar:3.0.0]
at org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:129) ~[springdoc-openapi-starter-webmvc-api-3.0.0.jar:3.0.0]
at org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(OpenApiWebMvcResource.java:117) ~[springdoc-openapi-starter-webmvc-api-3.0.0.jar:3.0.0]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-7.0.1.jar:7.0.1]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190) ~[spring-web-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934) ~[spring-webmvc-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853) ~[spring-webmvc-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86) ~[spring-webmvc-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866) ~[spring-webmvc-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003) ~[spring-webmvc-7.0.1.jar:7.0.1]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892) ~[spring-webmvc-7.0.1.jar:7.0.1]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:633) ~[jakarta.servlet-api-6.1.0.jar:6.1.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874) ~[spring-webmvc-7.0.1.jar:7.0.1]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723) ~[jakarta.servlet-api-6.1.0.jar:6.1.0]
at org.eclipse.jetty.ee11.servlet.ServletHolder.handle(ServletHolder.java:750) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1668) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.websocket.servlet.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:199) ~[jetty-ee11-websocket-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-7.0.1.jar:7.0.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.1.jar:7.0.1]
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-7.0.1.jar:7.0.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.1.jar:7.0.1]
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199) ~[spring-web-7.0.1.jar:7.0.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.1.jar:7.0.1]
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-7.0.1.jar:7.0.1]
at org.eclipse.jetty.ee11.servlet.FilterHolder.doFilter(FilterHolder.java:205) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1640) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1602) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletChannel.dispatch(ServletChannel.java:871) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletChannel.handle(ServletChannel.java:451) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.ServletHandler.handle(ServletHandler.java:470) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:546) ~[jetty-security-12.1.4.jar:12.1.4]
at org.eclipse.jetty.ee11.servlet.SessionHandler.handle(SessionHandler.java:763) ~[jetty-ee11-servlet-12.1.4.jar:12.1.4]
at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1224) ~[jetty-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.compression.server.CompressionHandler.handle(CompressionHandler.java:346) ~[jetty-compression-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.server.Handler$Wrapper.handle(Handler.java:794) ~[jetty-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.server.handler.EventsHandler.handle(EventsHandler.java:81) ~[jetty-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.server.Server.handle(Server.java:197) ~[jetty-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:720) ~[jetty-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:412) ~[jetty-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.server.internal.HttpConnection$FillableCallback.succeeded(HttpConnection.java:1810) ~[jetty-server-12.1.4.jar:12.1.4]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[jetty-io-12.1.4.jar:12.1.4]
at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54) ~[jetty-io-12.1.4.jar:12.1.4]
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:492) ~[jetty-util-12.1.4.jar:12.1.4]
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.epcRunTask(AdaptiveExecutionStrategy.java:428) ~[jetty-util-12.1.4.jar:12.1.4]
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:401) ~[jetty-util-12.1.4.jar:12.1.4]
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:255) ~[jetty-util-12.1.4.jar:12.1.4]
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:204) ~[jetty-util-12.1.4.jar:12.1.4]
at org.eclipse.jetty.util.thread.VirtualThreadPool.lambda$execute$0(VirtualThreadPool.java:276) ~[jetty-util-12.1.4.jar:12.1.4]
at java.base/java.util.concurrent.ThreadPerTaskExecutor$TaskRunner.run(ThreadPerTaskExecutor.java:291) ~[na:na]
at java.base/java.lang.VirtualThread.run(VirtualThread.java:456) ~[na:na]

The swagger ui page still works like before but I'm not sure if any deeper issue exists.
To Reproduce
Just start the spring boot application and open swagger web page, you will see the exception in console log.

Expected behavior
It shouldn't happen.

Additional context
According to the stacktrace aboce, it's caused by jackson 2.x because it doesn't recognize ObjectNode of jackson 3.x so it complains. I later found that swagger-project-jakarta is still depending on jackson 2.19.2, consider upgrade to jackson 3.x soon.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions