Skip to content

Commit 31b1c3e

Browse files
committed
Replace property placeholders in Logback component class names
Closes gh-34336
1 parent 50da0bc commit 31b1c3e

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/SpringBootJoranConfigurator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ private Class<?> inferTypeFromParent(Supplier<Object> parentSupplier, String tag
269269

270270
private Class<?> loadComponentType(String componentType) {
271271
try {
272-
return ClassUtils.forName(componentType, getClass().getClassLoader());
272+
return ClassUtils.forName(this.modelInterpretationContext.subst(componentType),
273+
getClass().getClassLoader());
273274
}
274275
catch (Throwable ex) {
275276
throw new RuntimeException("Failed to load component type '" + componentType + "'", ex);

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackConfigurationAotContributionTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.Properties;
27+
import java.util.function.Consumer;
2728
import java.util.function.Predicate;
2829
import java.util.stream.Stream;
2930

@@ -190,6 +191,18 @@ void componentTypesOfArraysAreRegisteredForReflection() {
190191
.accepts(generationContext.getRuntimeHints());
191192
}
192193

194+
@Test
195+
void placeholdersInComponentClassAttributeAreReplaced() {
196+
ComponentModel component = new ComponentModel();
197+
component.setClassName("${VARIABLE_CLASS_NAME}");
198+
TestGenerationContext generationContext = applyContribution(component,
199+
(context) -> context.putProperty("VARIABLE_CLASS_NAME", Outer.class.getName()));
200+
assertThat(invokePublicConstructorsAndInspectAndInvokePublicMethodsOf(Outer.class))
201+
.accepts(generationContext.getRuntimeHints());
202+
assertThat(invokePublicConstructorsAndInspectAndInvokePublicMethodsOf(Implementation.class))
203+
.accepts(generationContext.getRuntimeHints());
204+
}
205+
193206
private Predicate<RuntimeHints> invokePublicConstructorsOf(String name) {
194207
return RuntimeHintsPredicates.reflection()
195208
.onType(TypeReference.of(name))
@@ -220,7 +233,13 @@ private Condition<InMemoryGeneratedFiles> resource(String name) {
220233
}
221234

222235
private TestGenerationContext applyContribution(Model model) {
236+
return this.applyContribution(model, (context) -> {
237+
});
238+
}
239+
240+
private TestGenerationContext applyContribution(Model model, Consumer<LoggerContext> contextCustomizer) {
223241
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
242+
contextCustomizer.accept(context);
224243
SpringBootJoranConfigurator configurator = new SpringBootJoranConfigurator(null);
225244
configurator.setContext(context);
226245
withSystemProperty("spring.aot.processing", "true", () -> configurator.processModel(model));

0 commit comments

Comments
 (0)