jackson-databind icon indicating copy to clipboard operation
jackson-databind copied to clipboard

POI 5.4.1 和 Jackson-databind 2.15.3 的 Font 类 setCharSet 方法冲突问题

Open blydd opened this issue 6 months ago • 4 comments

Search before asking

  • [x] I searched in the issues and found nothing similar.

Describe the bug

问题描述

在 Spring Boot 项目中,使用 POI 版本 5.4.1 和 Jackson-databind 版本 2.15.3 时,出现 java.Lang.IllegalArgumentException 错误,具体错误信息为:

java.lang.IllegalArgumentException: Conflicting setter definitions for property "charSet": org.apache.poi.ss.usermodel.Font#setCharSet(byte) vs org.apache.poi.ss.usermodel.Font#setCharSet(int)

	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder._selectSetterFromMultiple(POJOPropertyBuilder.java:561) ~[jackson-databind-2.15.3.jar:2.15.3]

	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:492) ~[jackson-databind-2.15.3.jar:2.15.3]

	at io.swagger.v3.core.jackson.ModelResolver.ignore(ModelResolver.java:1250) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at io.swagger.v3.core.jackson.ModelResolver.resolve(ModelResolver.java:631) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at org.springdoc.core.converters.AdditionalModelsConverter.resolve(AdditionalModelsConverter.java:158) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.FileSupportConverter.resolve(FileSupportConverter.java:72) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.ResponseSupportConverter.resolve(ResponseSupportConverter.java:84) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.resolve(SchemaPropertyDeprecatingConverter.java:95) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.PolymorphicModelConverter.resolve(PolymorphicModelConverter.java:123) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at io.swagger.v3.core.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:97) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at io.swagger.v3.core.jackson.ModelResolver.resolve(ModelResolver.java:736) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at org.springdoc.core.converters.AdditionalModelsConverter.resolve(AdditionalModelsConverter.java:158) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.FileSupportConverter.resolve(FileSupportConverter.java:72) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.ResponseSupportConverter.resolve(ResponseSupportConverter.java:84) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.resolve(SchemaPropertyDeprecatingConverter.java:95) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.PolymorphicModelConverter.resolve(PolymorphicModelConverter.java:123) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at io.swagger.v3.core.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:97) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at io.swagger.v3.core.jackson.ModelResolver.resolve(ModelResolver.java:736) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at org.springdoc.core.converters.AdditionalModelsConverter.resolve(AdditionalModelsConverter.java:158) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.FileSupportConverter.resolve(FileSupportConverter.java:72) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.ResponseSupportConverter.resolve(ResponseSupportConverter.java:84) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.resolve(SchemaPropertyDeprecatingConverter.java:95) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.PolymorphicModelConverter.resolve(PolymorphicModelConverter.java:123) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at io.swagger.v3.core.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:97) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at io.swagger.v3.core.jackson.ModelResolver.resolve(ModelResolver.java:736) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at org.springdoc.core.converters.AdditionalModelsConverter.resolve(AdditionalModelsConverter.java:158) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.FileSupportConverter.resolve(FileSupportConverter.java:72) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.ResponseSupportConverter.resolve(ResponseSupportConverter.java:84) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.resolve(SchemaPropertyDeprecatingConverter.java:95) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.PolymorphicModelConverter.resolve(PolymorphicModelConverter.java:123) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at io.swagger.v3.core.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:97) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at io.swagger.v3.core.jackson.ModelResolver.resolve(ModelResolver.java:488) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at org.springdoc.core.converters.AdditionalModelsConverter.resolve(AdditionalModelsConverter.java:158) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.FileSupportConverter.resolve(FileSupportConverter.java:72) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.ResponseSupportConverter.resolve(ResponseSupportConverter.java:84) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.resolve(SchemaPropertyDeprecatingConverter.java:95) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.PolymorphicModelConverter.resolve(PolymorphicModelConverter.java:123) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at io.swagger.v3.core.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:97) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at io.swagger.v3.core.jackson.ModelResolver.resolve(ModelResolver.java:736) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at org.springdoc.core.converters.AdditionalModelsConverter.resolve(AdditionalModelsConverter.java:158) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.FileSupportConverter.resolve(FileSupportConverter.java:72) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.ResponseSupportConverter.resolve(ResponseSupportConverter.java:84) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.SchemaPropertyDeprecatingConverter.resolve(SchemaPropertyDeprecatingConverter.java:95) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.converters.PolymorphicModelConverter.resolve(PolymorphicModelConverter.java:123) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at io.swagger.v3.core.converter.ModelConverterContextImpl.resolve(ModelConverterContextImpl.java:97) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at io.swagger.v3.core.converter.ModelConverters.resolveAsResolvedSchema(ModelConverters.java:191) ~[swagger-core-jakarta-2.2.25.jar:2.2.25]

	at org.springdoc.core.utils.SpringDocAnnotationsUtils.extractSchema(SpringDocAnnotationsUtils.java:133) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.service.GenericResponseService.calculateSchema(GenericResponseService.java:563) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.service.GenericResponseService.buildContent(GenericResponseService.java:541) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.service.GenericResponseService.buildContent(GenericResponseService.java:522) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.service.GenericResponseService.buildApiResponses(GenericResponseService.java:595) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.service.GenericResponseService.buildApiResponses(GenericResponseService.java:476) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.core.service.GenericResponseService.build(GenericResponseService.java:264) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:610) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:801) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$11(OpenApiResource.java:222) ~[springdoc-openapi-starter-webmvc-api-2.7.0.jar:2.7.0]

	at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na]

	at org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:203) ~[springdoc-openapi-starter-webmvc-api-2.7.0.jar:2.7.0]

	at org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:173) ~[springdoc-openapi-starter-webmvc-api-2.7.0.jar:2.7.0]

	at java.base/java.util.Optional.ifPresent(Optional.java:178) ~[na:na]

	at org.springdoc.webmvc.api.OpenApiResource.getPaths(OpenApiResource.java:152) ~[springdoc-openapi-starter-webmvc-api-2.7.0.jar:2.7.0]

	at org.springdoc.api.AbstractOpenApiResource.getOpenApi(AbstractOpenApiResource.java:370) ~[springdoc-openapi-starter-common-2.7.0.jar:2.7.0]

	at org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:127) ~[springdoc-openapi-starter-webmvc-api-2.7.0.jar:2.7.0]

	at org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(OpenApiWebMvcResource.java:117) ~[springdoc-openapi-starter-webmvc-api-2.7.0.jar:2.7.0]

	at org.springdoc.webmvc.api.MultipleOpenApiWebMvcResource.openapiJson(MultipleOpenApiWebMvcResource.java:97) ~[springdoc-openapi-starter-webmvc-api-2.7.0.jar:2.7.0]

	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]

	at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]

	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:258) ~[spring-web-6.2.5.jar:6.2.5]

	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:191) ~[spring-web-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.39.jar:6.0]

	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.5.jar:6.2.5]

	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.39.jar:6.0]

	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.5.jar:6.2.5]

	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.5.jar:6.2.5]

	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.5.jar:6.2.5]

	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.5.jar:6.2.5]

	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:114) ~[spring-web-6.2.5.jar:6.2.5]

	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.5.jar:6.2.5]

	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.5.jar:6.2.5]

	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.5.jar:6.2.5]

	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.39.jar:10.1.39]

	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]

此错误表明 Jackson 在序列化和反序列化过程中,无法处理 org.apache.poi.ss.usermodel.Font 类中两个同名但参数类型不同的 setCharSet 方法。

复现步骤

启动springboot项目,添加相关依赖,并集成springdoc-openapi-starter-webmvc-ui,当访问swagger时刷新swagger页面后台报上面错误,系统中相关的导出功能正常,只有访问swagger页面时才报错。

期望的解决方案

希望能够找到一个兼容的 POI 和 Jackson-databind 版本组合,或者提供一种有效的解决方法来避免 Jackson 在处理 org.apache.poi.ss.usermodel.Font 类的 setCharSet 方法时出现冲突。

环境信息

操作系统:win11 Java 版本:1.8 Spring Boot 版本:3.4.4 POI 版本:5.4.1 Jackson-databind 版本:2.15.3

Version Information

2.15.3

Reproduction

<-- Any of the following

  1. Brief code sample/snippet: include here in preformatted/code section
  2. Longer example stored somewhere else (diff repo, snippet), add a link
  3. Textual explanation: include here -->
// Your code here

Expected behavior

No response

Additional context

No response

blydd avatar Apr 24 '25 09:04 blydd