Skip to content

Property placeholders for class names in XML config are not resolved #34909

Closed as not planned
@cdprete

Description

@cdprete

Hello.

I've a Spring Boot 3.4.5 project that uses the old XML style to configure the application context.

While in Spring Boot 2.1.16, the below was working fine:

appContext.xml

<context:property-placeholder ignore-resource-not-found="true" location="classpath:/testConfig.properties,/config.properties" />

<import resource="beanContext.xml" />

beanContext.xml

<import resource="infrastructureContext.xml" />

<import resource="functionContext.xml" />

<!-- Other beans -->

infrastructureContext.xml

<context:annotation-config />
<context:component-scan base-package="com.foo.dfi.hiku.commons.util.model.mdf" />

<bean id="bplCall" class="${bpl.class}">
    <constructor-arg value="${bpl.server}" />
    <constructor-arg value="${bpl.port}" />
    <property name="Application" value="${bpl.name}" />
</bean>

<!-- Other beans -->

in Spring Boot 3.4.5 fails with:

2025-05-16 10:38:32,510 [main] ERROR KFFCalculatorApplication:103 - org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [${bpl.class}] for bean with name 'bplCall' defined in file [C:\Daten\gitlab\hiku-kff-calculator\target\classes\infrastructureContext.xml]
org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [${bpl.class}] for bean with name 'bplCall' defined in file [C:\Daten\gitlab\hiku-kff-calculator\target\classes\infrastructureContext.xml]
	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1585) ~[spring-beans-6.2.6.jar:6.2.6]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:692) ~[spring-beans-6.2.6.jar:6.2.6]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:660) ~[spring-beans-6.2.6.jar:6.2.6]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:738) ~[spring-beans-6.2.6.jar:6.2.6]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:817) ~[spring-beans-6.2.6.jar:6.2.6]
	at org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector.detect(AnnotationDependsOnDatabaseInitializationDetector.java:36) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.detectDependsOnInitializationBeanNames(DatabaseInitializationDependencyConfigurer.java:152) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.postProcessBeanFactory(DatabaseInitializationDependencyConfigurer.java:115) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:363) ~[spring-context-6.2.6.jar:6.2.6]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:197) ~[spring-context-6.2.6.jar:6.2.6]
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:791) ~[spring-context-6.2.6.jar:6.2.6]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:609) ~[spring-context-6.2.6.jar:6.2.6]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:753) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1362) ~[spring-boot-3.4.5.jar:3.4.5]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1351) ~[spring-boot-3.4.5.jar:3.4.5]
	at com.sixgroup.dfi.hiku.kff.calculator.KFFCalculatorApplication.execute(KFFCalculatorApplication.java:65) [classes/:?]
	at com.sixgroup.dfi.hiku.kff.calculator.KFFCalculatorApplication.main(KFFCalculatorApplication.java:59) [classes/:?]
Caused by: java.lang.ClassNotFoundException: ${bpl.class}
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?]
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?]
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
	at java.base/java.lang.Class.forName0(Native Method) ~[?:?]
	at java.base/java.lang.Class.forName(Class.java:534) ~[?:?]
	at java.base/java.lang.Class.forName(Class.java:513) ~[?:?]
	at org.springframework.util.ClassUtils.forName(ClassUtils.java:321) ~[spring-core-6.2.6.jar:6.2.6]
	at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:503) ~[spring-beans-6.2.6.jar:6.2.6]

What I observed is that this is happening only for beans which have dynamic/property-based class names.
In the Spring migration documentation I cannot really spot anything useful, so your help would be highly appreciated here.

Kind regards and thanks.

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: invalidAn issue that we don't feel is valid

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions