Skip to content

Conditions on an overriding bean method effectively get ignored [SPR-12694] #17292

Closed
@spring-projects-issues

Description

@spring-projects-issues

Andy Wilkinson opened SPR-12694 and commented

In Spring Boot, I'd like to be able to override a method in a Spring Data REST configuration class to make it conditional, however this doesn't work. The condition on the overriding method is evaluated and correctly considered as not matching but the overridden method is then also considered. It has no conditions so a bean definition is created.

This is illustrated by this test:

import java.util.Map;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.type.AnnotatedTypeMetadata;

import static org.junit.Assert.assertEquals;

public class ConditionalOverriddenBeanMethodTests {

	@Test
	public void conditionsOnOverriddenMethodsAreHonoured() {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
				Bar.class);
		Map<String, Baz> beansOfType = context.getBeansOfType(Baz.class);
		assertEquals(0, beansOfType.size());
	}

	@Configuration
	private static class Foo {

		@Bean
		public Baz baz() {
			return new Baz();
		}

	}

	private static class Bar extends Foo {

		@Override
		@Bean
		@Conditional(NeverMatchesCondition.class)
		public Baz baz() {
			return new Baz();
		}

	}

	private static class Baz {

	}

	private static class NeverMatchesCondition implements Condition {

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

	}

}

My expectation is that the condition will prevent the Baz bean from being created.


Affects: 4.1.4

Reference URL: spring-projects/spring-boot#2267

Issue Links:

0 votes, 5 watchers

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)type: bugA general bug

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions