Hello,

I'm working on the migration of an application using Java and the Spring framework. The migration is a big step, the libs versions are moving as follows :

  • Java JDK1.6 to JDK11
  • Spring Framework 3.2.0 to 5.3.1
  • Spring Integration 3.0.0 to 5.4.1
  • Spring Security 3.1.0 to 5.4.2

I spent some times on the compiling issues but now I'm stuck when starting the application.

The application configuration is most of all xml beans configuration (and spring integration messaging configuration). When starting and creating the beans, application always fails with the same NullPointerException.

Example 1 :

A simple jdbc initialize with two scripts like this :

    <jdbc:initialize-database data-source="userDataSource" enabled="true" ignore-failures="DROPS">
        <jdbc:script location="classpath:/security/Clear.sql" />
        <jdbc:script location="#{securityUsersSql}" />
    </jdbc:initialize-database>

Leads to this NPE :


    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSourceInitializer#0': Cannot create inner bean '(inner bean)#62794322' of type [org.springframework.jdbc.datasource.init.CompositeDatabasePopulator] while setting bean property 'databasePopulator'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#62794322': Cannot create inner bean '(inner bean)#6a35384f' of type [org.springframework.jdbc.datasource.init.ResourceDatabasePopulator] while setting bean property 'populators' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#6a35384f': Cannot create inner bean '(inner bean)#f5677960' of type [org.springframework.jdbc.config.SortedResourcesFactoryBean] while setting bean property 'scripts'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#f5677960': Unexpected exception during bean creation; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:389)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:134)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1691)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1436)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$237/000000000000000000.getObject(Unknown Source)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
        at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:930)
        at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:553)
        at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:889)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:356)
        at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1445)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1409)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:822)
        at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:275)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
        at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:550)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:100)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.server.Server.start(Server.java:407)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:100)
        at org.eclipse.jetty.server.Server.doStart(Server.java:371)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:760)
        at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:636)
        at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:898)
        at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:705)
        at com.google.gwt.dev.DevMode.main(DevMode.java:432)
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#62794322': Cannot create inner bean '(inner bean)#6a35384f' of type [org.springframework.jdbc.datasource.init.ResourceDatabasePopulator] while setting bean property 'populators' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#6a35384f': Cannot create inner bean '(inner bean)#f5677960' of type [org.springframework.jdbc.config.SortedResourcesFactoryBean] while setting bean property 'scripts'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#f5677960': Unexpected exception during bean creation; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:389)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:134)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:428)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:173)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1691)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1436)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:374)
        ... 42 more
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#6a35384f': Cannot create inner bean '(inner bean)#f5677960' of type [org.springframework.jdbc.config.SortedResourcesFactoryBean] while setting bean property 'scripts'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#f5677960': Unexpected exception during bean creation; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:389)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:134)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1691)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1436)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:374)
        ... 50 more
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#f5677960': Unexpected exception during bean creation; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:544)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:374)
        ... 56 more
    Caused by: java.lang.NullPointerException
        at java.base/java.lang.Class.isAssignableFrom(Native Method)
        at org.springframework.beans.BeanUtils.findEditorByConvention(BeanUtils.java:566)
        at org.springframework.beans.TypeConverterDelegate.findDefaultEditor(TypeConverterDelegate.java:337)
        at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:153)
        at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73)
        at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:759)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:228)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1206)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
        ... 57 more

If I comment this part out, to understand and see where it leads, it comes to the Spring Integration beans part.

Example 2 :

A simple logging-chanel-adapter is leading to the same NPE


    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:si="http://www.springframework.org/schema/integration"
        xmlns:si-file="http://www.springframework.org/schema/integration/file"
        xmlns:si-jpa="http://www.springframework.org/schema/integration/jpa"
        xmlns:si-xml="http://www.springframework.org/schema/integration/xml"
        xmlns:task="http://www.springframework.org/schema/task"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/integration
                http://www.springframework.org/schema/integration/spring-integration.xsd
                http://www.springframework.org/schema/integration/file
                http://www.springframework.org/schema/integration/file/spring-integration-file.xsd
                http://www.springframework.org/schema/integration/jpa
                http://www.springframework.org/schema/integration/jpa/spring-integration-jpa.xsd
                http://www.springframework.org/schema/integration/xml
                http://www.springframework.org/schema/integration/xml/spring-integration-xml.xsd
                http://www.springframework.org/schema/task
                    http://www.springframework.org/schema/task/spring-task.xsd
                http://www.springframework.org/schema/util
                http://www.springframework.org/schema/util/spring-util.xsd">

        <import resource="classpath:/META-INF/spring/configurationContext.xml" />

            <beans profile="dev,prod,import-plan">

            <!--  log messages -->
            <si:wire-tap channel="pid-logger" pattern="pid-in,pid-endOfFlowChannel,pid-replyChannel"/>
            <si:logging-channel-adapter id="pid-logger" log-full-message="true" level="INFO"/>

        </beans>

    </beans>

Stack :


    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.integration.handler.LoggingHandler#0': Unexpected exception during bean creation; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:544)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$237/000000000000000000.getObject(Unknown Source)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
        at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:930)
        at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:553)
        at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:889)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:356)
        at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1445)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1409)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:822)
        at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:275)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
        at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:550)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:100)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.server.Server.start(Server.java:407)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:100)
        at org.eclipse.jetty.server.Server.doStart(Server.java:371)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:760)
        at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:636)
        at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:898)
        at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:705)
        at com.google.gwt.dev.DevMode.main(DevMode.java:432)
    Caused by: java.lang.NullPointerException
        at java.base/java.lang.Class.isAssignableFrom(Native Method)
        at org.springframework.beans.BeanUtils.findEditorByConvention(BeanUtils.java:566)
        at org.springframework.beans.TypeConverterDelegate.findDefaultEditor(TypeConverterDelegate.java:337)
        at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:153)
        at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73)
        at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:53)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:759)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:228)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1206)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
        ... 37 more

Example 3 :

Again if I comment it out, with an inbound-channel-adapter


    <beans profile="dev,prod,import-plan">

            <!--  log messages -->
    <!--        <si:wire-tap channel="pid-logger" pattern="pid-in,pid-endOfFlowChannel,pid-replyChannel"/> -->
    <!--        <si:logging-channel-adapter id="pid-logger" log-full-message="true" level="INFO"/> -->

            <si:publish-subscribe-channel id="pid-errorChannel" />

            <bean id="pid-alarm-publisher" class="com.cy.sylphe.planner.server.integration.plan.in.AlarmPublisher">
                <constructor-arg ref="entityManager" />
            </bean>

                <!-- end of flow when exception are raised (move the import file to ./rejected) -->
                <si:service-activator input-channel="pid-errorChannel">
                <bean class="com.cy.sylphe.planner.server.integration.plan.in.ExceptionHandler">
                    <constructor-arg ref="pid-alarm-publisher" />
                </bean>
                </si:service-activator>

            <bean id="pid-finalizer" class="com.cy.sylphe.planner.server.integration.plan.in.Finalizer">
                <property name="entityManager" ref="entityManager" />
            </bean>

            <!-- parse input directory, periodically -->
            <si-file:inbound-channel-adapter id="pid-loadPlansChannel" directory="${plans-import-directory}"
                filename-pattern="${plans-import-file-pattern}" prevent-duplicates="false">
                <si:poller id="poller" fixed-rate="${plans-import-fixed-rate}" error-channel="pid-errorChannel">
                        <!-- use a time-out to stop the flow when the XML file cannot finish -->
                <si:transactional propagation="REQUIRED" transaction-manager="transactionManager" timeout="2000"/>
                </si:poller>
            </si-file:inbound-channel-adapter>

    </beans>

Stack :


    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pid-loadPlansChannel.adapter.source': Initialization of bean failed; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:617)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$237/000000000000000000.getObject(Unknown Source)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:925)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588)
        at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
        at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:930)
        at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:553)
        at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:889)
        at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:356)
        at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1445)
        at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1409)
        at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:822)
        at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:275)
        at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
        at com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload.doStart(JettyLauncher.java:550)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:100)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
        at org.eclipse.jetty.server.Server.start(Server.java:407)
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
        at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:100)
        at org.eclipse.jetty.server.Server.doStart(Server.java:371)
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
        at com.google.gwt.dev.shell.jetty.JettyLauncher.start(JettyLauncher.java:760)
        at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:636)
        at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:898)
        at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:705)
        at com.google.gwt.dev.DevMode.main(DevMode.java:432)
    Caused by: java.lang.NullPointerException
        at java.base/java.lang.Class.isAssignableFrom(Native Method)
        at org.springframework.beans.BeanUtils.findEditorByConvention(BeanUtils.java:566)
        at org.springframework.beans.TypeConverterDelegate.findDefaultEditor(TypeConverterDelegate.java:337)
        at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:153)
        at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:98)
        at org.springframework.beans.TypeConverterDelegate.convertToTypedArray(TypeConverterDelegate.java:455)
        at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:172)
        at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:588)
        at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:607)
        at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:219)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1740)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1696)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1436)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
        ... 38 more

All those examples were working well before migration. I can't see something common between those examples or something obvious that could lead to this same NPE each time (and there are many others if I keep going). There is something I don't understand, I'm missing out on something.

Any idea ? Thanks for help

Comment From: jhoeller

According to the stacktrace, this fails with the argument in a ClassUtils.isAssignableFrom call, operating on the result of a ClassLoader.loadClass call. According to the ClassLoader contract, a loadClass call never returns null, it rather fails with a ClassNotFoundException. Which ClassLoader are you running on there?

This code hasn't changed in Spring itself, so I suspect it's not the Spring version upgrade that is causing it but rather some other upgraded part of your stack. It could be related to the JDK but in particular to your runtime container, Jetty or GWT possibly?

Comment From: jhoeller

Specifically, we need to find out which ClassLoader is in actual use there, ideally on the ApplicationContext itself but even Thread.currentThread().getContextClassLoader() probably returns the same on startup. Then we'd have to check which project that ClassLoader implementation originates from, possibly check their loadClass implementation if we have access to the source code, and report it as a bug to them (since they must never return null, always throw a ClassNotFoundException instead).

We could generally make loadClass calling code defensive by checking against null in such places. That feels like a workaround against implementations that break the ClassLoader contract, but for this particular common spot, we could add it if necessary.

Comment From: axeldufo

Thanks for helping.

It looks like it comes from Jetty. When debugging the NPE, the cl is JettyLauncher$WebAppContextWithReload$WebAppClassLoaderExtension

(Sorry I did not mention : using Jetty 9.4.34 and GWT 2.9.0)

Comment From: jhoeller

From a quick glance, the culprit seems to be in the GWT-owned JettyLauncher class loader extension indeed: https://github.com/gwtproject/gwt/blob/master/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java#L458 That line should not return null but rather build a custom ClassNotFoundException and throw it. Worth reporting to them...

Comment From: jhoeller

I'm repurposing this ticket for defensive handling of such unexpected null results from loadClass, against any misbehaving ClassLoader implementation. We may not be able to do this everywhere, but at least in such low-level places such as BeanUtils, it doesn't hurt to be defensive even against SPI contract violations.

My local revision seems reasonably straightforward, so it can easily make it into 5.3.3 and also into the 5.2.13 backport release.

Comment From: axeldufo

Thank you very much for such reactivity.

In this particular case, best solution may be to make my own GWT build, updating Jetty in there. It has been done before (see here) and may be useful as GWT last release is from May but Jetty is regularly updated.

Anyway, this defensively handling is welcome, thanks.