Аннотация Spring Autowire в абстрактном классе: уникальный компонент не определен
у меня есть абстрактный класс:
@Component
public abstract class BaseReport {
public void export() {
...
}
и куча классов, которые расширяют его и переопределяют метод export () (или нет).
@Component
public final class Report1 extends BaseReport
@Component
public final class Report2 extends BaseReport
большинство моих тестов autowire конкретных классов, которые расширяют BaseReport, без проблем:
public class Report1Test extends BaseTest {
@Autowired
Report1 _report;
public class Report2Test extends BaseTest {
@Autowired
Report2 _report;
это отлично работает для автозапуска всех классов, которые расширения BaseReport. Но мне также нужно autowire сам абстрактный класс, BaseReport, чтобы проверить метод export ().
public class BaseReportTest extends BaseTest {
@Autowired
BaseReport _report;
когда я пытаюсь запустить его, я получаю печально:
не определен уникальный компонент типа BaseReport: ожидаемый одиночный соответствующий компонент, но найден 2 [Report1, Report2].
Я пробовал использовать @Qualifier, но проблема с @Qualifier заключается в том, что (как я понимаю) вы используете его, чтобы сообщить Spring, какой класс - который реализует интерфейс или расширяет абстрактный класс-вы хотите использовать. Но это не мое дело. Я хочу использовать абстрактный класс себя.
Я также попытался использовать @Resource, например:
public class BaseReportTest extends BaseTest {
@Resource(name = "baseReport")
BaseReport _report;
весна говорит мне, что нет боба с этим именем. :(
как я могу это сделать?
Ура.
1 ответов
абстрактные классы не могут быть созданы, вам нужно использовать конкретную реализацию. Как и в обычной java, если вы пытаетесь создать экземпляр абстрактного класса, он говорит вам реализовать абстрактные методы внутри. При этом создается анонимный класс. Это не instatiation абстрактного класса, но новый подкласс, что абстрактный класс.
Spring будет искать классы, которые расширяют ваш базовый класс, будучи Report1 и Report2, Spring видит, что он имеет несколько классов, которые соответствует требованиям и не знает, какой из них выбрать. таким образом, вы получаете ошибку, что есть несколько совпадающих бобов.
вы можете исправить это, сделав "адаптер" основательно создать конкретный класс, который расширяет ваш базовый класс, реализует абстрактные методы, но ничего не делает. Затем вы можете autowire эту реализацию и протестировать против нее. Однако ваш абстрактный класс должен быть уже протестирован из-за того, что вы тестируете отчет 1 и 2. Если ошибки все еще происходят с ваш базовый класс, это означает, что логика, которую вы не используете, вызывает ошибки, что в любом случае является плохой практикой. также с помощью инструмента тестирования coveage вы можете обнаружить неиспользуемый код таким образом.