Skip to content

Property placeholders in class names are not resolved leading to an exception #34908

Closed as duplicate of#34909
@cdprete

Description

@cdprete

Bug Reports
Hello.

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

While in Spring Boot 2.1.16 / Spring 5.1.8, 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.foo.dfi.hiku.kff.calculator.KFFCalculatorApplication.execute(KFFCalculatorApplication.java:65) [classes/:?]
	at com.foo.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

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions