Skip to content

Conditions on super-classes are not considered when importing configuration classes #34411

@wilkinsona

Description

@wilkinsona

Here's a test that illustrates the problem:

class ConditionInheritanceTests {

	@Test
	void test() {
		try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
			context.register(Importer.class);
			context.refresh();
			assertThatExceptionOfType(NoSuchBeanDefinitionException.class)
				.isThrownBy(() -> context.getBean(DirectlyAnnotatedConfiguration.class));
			assertThatExceptionOfType(NoSuchBeanDefinitionException.class)
				.isThrownBy(() -> context.getBean(OnlySuperClassAnnotatedConfiguration.class));
		}
	}

	@Import({ DirectlyAnnotatedConfiguration.class, OnlySuperClassAnnotatedConfiguration.class })
	static class Importer {

	}

	@Configuration
	@Conditional(TestCondition.class)
	static class BaseConfiguration {

	}

	@Conditional(TestCondition.class)
	static class DirectlyAnnotatedConfiguration extends BaseConfiguration {

	}

	static class OnlySuperClassAnnotatedConfiguration extends BaseConfiguration {

	}

	static class TestCondition implements Condition {

		@Override
		public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
			return false;
		}

	}

}

My expectation is that neither DirectlyAnnotatedConfiguration nor OnlySuperClassAnnotatedConfiguration will be registered in the context. The actual behavior is that OnlySuperClassAnnotatedConfiguration is registered so the second assertion in the test fails.

Metadata

Metadata

Assignees

No one assigned

    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