У меня есть бин foo, в котором есть сеттер и пара полей @Autowired. С помощью установщика я определяю, какой валидатор использовать во время выполнения.
foo
@Autowired
Моя проблема: я также определяю доступные валидаторы в Spring.
Это означает: как только я пытаюсь создать экземпляр foo, я получаю сообщение об ошибке, что есть несколько bean-компонентов, реализующих IValidator, и Spring не может решить, какой из них использовать для вызова моего сеттера. Duh.
IValidator
Есть ли способ сказать Spring "игнорировать этот сеттер"?
[РЕДАКТИРОВАТЬ] Код действительно прост:
public class AutowireTestBean { // Required bean without setter @Autowired private TestBean autowired; public TestBean getAutowired() { return autowired; } // Standard setter. If this bean is missing, nothing bad happens private OptionalBean optional; public void setOptional( OptionalBean optional ) { this.optional = optional; } public OptionalBean getOptional() { return optional; } }
XML выглядит так:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-autowire="byType" default-lazy-init="true"> <bean id="bean" class="AutowireTestBean" /> <bean id="autowired" class="TestBean" /> <bean id="optional1" class="OptionalBean" /> <bean id="optional2" class="OptionalBean" /> <context:annotation-config /> </beans>
Это броски: UnsatisfiedDependencyException: Error creating bean with name 'bean' ... expected single matching bean but found 2: [optional1, optional2]
UnsatisfiedDependencyException: Error creating bean with name 'bean' ... expected single matching bean but found 2: [optional1, optional2]
Удалите default-autowire="byType" из вашего XML-файла.
default-autowire="byType"
В этом случае для связывания бинов будут использоваться только аннотации, и поэтому Spring будет вызывать только сеттеры, отмеченные @Autowired.
Вы можете использовать @Qualifier для члена OptionalBean:
@Qualifier
OptionalBean
@Autowired @Qualifier("optional1") // or optional2 private OptionalBean optional;
или на сеттер:
@Autowired @Qualifier("optional1") // or optional2 public void setOptional( OptionalBean optional ) { this.optional = optional; }