Hello, I have an issue with TomEE that Spring-web forces me to add "jackson-dataformat-yaml" dependency.
This dependency is not needed/used in my application.

org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter founds jackson2YamlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.yaml.YAMLFactory", classLoader); in the base class loader. But this dependency does not exist in the application context class loader and cannot create org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.YamlFactoryInitializer#create instance of com.fasterxml.jackson.dataformat.yaml.YAMLFactory.

  • Spring 6.2.3
  • TomEE Plus 10.0.0

Do you have any suggestions/fixes for this issue without removing "jackson-dataformat-yaml" dependency from TomEE?

Stack trace:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter': Cannot create inner bean '(inner bean)#7aaf3a74' of type [org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter] while setting bean property 'messageConverters' with key [4]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBeanValue(BeanDefinitionValueResolver.java:421) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.lambda$resolveValueIfNecessary$1(BeanDefinitionValueResolver.java:153) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:262) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:152) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:460) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:191) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1711) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1460) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:346) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1155) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1121) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1056) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) ~[spring-context-6.2.3.jar:6.2.3]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.3.jar:6.2.3]
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:394) ~[spring-web-6.2.3.jar:6.2.3]
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:274) ~[spring-web-6.2.3.jar:6.2.3]
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:126) ~[spring-web-6.2.3.jar:6.2.3]
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4008) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4436) ~[catalina.jar:10.1.34]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:654) ~[catalina.jar:10.1.34]
    at org.apache.tomee.catalina.TomcatWebAppBuilder.deployWar(TomcatWebAppBuilder.java:684) ~[tomee-catalina-10.0.0.jar:10.0.0]
    at org.apache.tomee.catalina.TomcatWebAppBuilder.deployWebApps(TomcatWebAppBuilder.java:613) ~[tomee-catalina-10.0.0.jar:10.0.0]
    at org.apache.tomee.catalina.deployment.TomcatWebappDeployer.deploy(TomcatWebappDeployer.java:47) ~[tomee-catalina-10.0.0.jar:10.0.0]
    at org.apache.openejb.assembler.DeployerEjb.deploy(DeployerEjb.java:177) ~[openejb-core-10.0.0.jar:10.0.0]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]
    at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
    at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:210) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:191) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.security.internal.InternalSecurityInterceptor.invoke(InternalSecurityInterceptor.java:35) ~[openejb-core-10.0.0.jar:10.0.0]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]
    at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
    at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:210) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:191) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:191) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:101) ~[openejb-core-10.0.0.jar:10.0.0]
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?]
    at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?]
    at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:210) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:191) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:95) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.core.singleton.SingletonContainer._invoke(SingletonContainer.java:272) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.core.singleton.SingletonContainer.invoke(SingletonContainer.java:221) ~[openejb-core-10.0.0.jar:10.0.0]
    at org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:371) ~[openejb-ejbd-10.0.0.jar:10.0.0]
    at org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:182) ~[openejb-ejbd-10.0.0.jar:10.0.0]
    at org.apache.openejb.server.ejbd.EjbDaemon.processEjbRequest(EjbDaemon.java:360) ~[openejb-ejbd-10.0.0.jar:10.0.0]
    at org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:247) ~[openejb-ejbd-10.0.0.jar:10.0.0]
    at org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:104) ~[openejb-ejbd-10.0.0.jar:10.0.0]
    at org.apache.openejb.server.httpd.ServerServlet.service(ServerServlet.java:60) ~[openejb-http-10.0.0.jar:10.0.0]
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[servlet-api.jar:6.0]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[catalina.jar:10.1.34]
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) ~[tomee-catalina-10.0.0.jar:10.0.0]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[catalina.jar:10.1.34]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[catalina.jar:10.1.34]
    at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97) ~[tomee-catalina-10.0.0.jar:10.0.0]
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:663) ~[catalina.jar:10.1.34]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[catalina.jar:10.1.34]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[catalina.jar:10.1.34]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-coyote.jar:10.1.34]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-coyote.jar:10.1.34]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-coyote.jar:10.1.34]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-coyote.jar:10.1.34]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-coyote.jar:10.1.34]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-util.jar:10.1.34]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-util.jar:10.1.34]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-util.jar:10.1.34]
    at java.base/java.lang.Thread.run(Thread.java:1583) [?:?]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#7aaf3a74': Failed to instantiate [org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter]: Constructor threw exception
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1343) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1228) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBeanValue(BeanDefinitionValueResolver.java:407) ~[spring-beans-6.2.3.jar:6.2.3]
    ... 76 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter]: Constructor threw exception
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:222) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1337) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1228) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBeanValue(BeanDefinitionValueResolver.java:407) ~[spring-beans-6.2.3.jar:6.2.3]
    ... 76 more
Caused by: java.lang.VerifyError: Bad return type
Exception Details:
  Location:
    org/springframework/http/converter/json/Jackson2ObjectMapperBuilder$YamlFactoryInitializer.create()Lcom/fasterxml/jackson/core/JsonFactory; @7: areturn
  Reason:
    Type 'com/fasterxml/jackson/dataformat/yaml/YAMLFactory' (current frame, stack[0]) is not assignable to 'com/fasterxml/jackson/core/JsonFactory' (from method signature)
  Current Frame:
    bci: @7
    flags: { }
    locals: { 'org/springframework/http/converter/json/Jackson2ObjectMapperBuilder$YamlFactoryInitializer' }
    stack: { 'com/fasterxml/jackson/dataformat/yaml/YAMLFactory' }
  Bytecode:
    0000000: bb00 0759 b700 09b0                    

    at org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.yaml(Jackson2ObjectMapperBuilder.java:943) ~[spring-web-6.2.3.jar:6.2.3]
    at org.springframework.http.converter.yaml.MappingJackson2YamlHttpMessageConverter.<init>(MappingJackson2YamlHttpMessageConverter.java:50) ~[spring-web-6.2.3.jar:6.2.3]
    at org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter.<init>(AllEncompassingFormHttpMessageConverter.java:116) ~[spring-web-6.2.3.jar:6.2.3]
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[?:?]
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[?:?]
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?]
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:196) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1337) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1228) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.3.jar:6.2.3]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBeanValue(BeanDefinitionValueResolver.java:407) ~[spring-beans-6.2.3.jar:6.2.3]

Comment From: sdeleuze

I advise to ask on TomEE side with a reproducer, AllEncompassingFormHttpMessageConverter is already using its classloader for the classpath check, so on Spring side, I think we don't have anything actionable.