Spring Boot не распознает интерфейс - PullRequest
1 голос
/ 07 марта 2020

У меня есть такой интерфейс:

public interface Animal {
  void setName(String animal);
  String getName();
}

, и у меня есть класс, который реализует интерфейс:

@Component
public class Dog implements Animal {
    private String name;
    public void setName(String name) {
          this.name= name;
    }

    public String getName() {
          return this.name;
    }
}

В другом классе (ProcessAnimal), я AutoWire интерфейс:

public class ProcessAnimal {
     @Autowired
     public Animal animal;

     public void processAnimals() {
         animal.setName("Fido");
     }
}

У меня есть только один класс, который реализует Animal, поэтому это должно работать, однако я получаю NullPointerException, когда он попадает в строку animal.setName("Fido");. IntelliJ жалуется, что Autowired members must be defined in valid Spring bean (@Component|@Service...), который у меня есть ... Я не понимаю, что я делаю неправильно. Я пытался добавить @Qualifier, но все равно он не работал и не должен был быть необходим, поскольку у меня есть только одна реализация.

-java
    -com.example.com.AnimalProcessing
    -Animal
       -Animal.java
       -Dog.java
    -ProcessAnimal.java
    -AnimalProcessingApplication.java

AnimalProcessingApplication. java

@SpringBootApplication
public class AnimalProcessingApplication {
     public static void main(String[] args) {
           SpringApplication.run(AnimalProcessingApplication.class, args);
           run();
     }

     public static void run() {
           ProcessAnimal processAnimal = new ProcessAnimal();
           processAnimal.processAnimals();
     }
}

Ответы [ 3 ]

0 голосов
/ 07 марта 2020

Для работы этой программы необходимо сделать следующее.

1. ProcessAnimal должен быть сделан компонентом. Аннотирование класса с помощью @Component помечает класс для автоматического определения во время сканирования компонента.

@Component
public class ProcessAnimal {
     @Autowired
     public Animal animal;

     public void processAnimals() {
         animal.setName("Fido");
     }
}
Получить класс ProcessAnimal из контекста приложения. Пружина подготовит bean-компонент ProcessAnimal со всеми установленными зависимостями.

Вы можете сделать это несколькими способами, и один из них

@Component
public class CheckRedRunner implements ApplicationRunner {

    @Autowired
    ProcessAnimal process;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        process.processAnimals();
    }

}

реализует компонент, реализующий ApplicationRunner. будет запущен при запуске приложения.

или

public static void main(String[] args) {
          ApplicationContext ctx = SpringApplication.run(AnimalProcessingApplication.class, args);
          ProcessAnimal process = ctx.getBean(ProcessAnimal.class);
          process.processAnimals();
     }

Пара наблюдений

  1. в именах пакетов по соглашению используются строчные буквы

пример: com.example.process.entity

Пожалуйста, go в официальной документации , чтобы узнать ожидаемый способ написания загрузочного приложения Spring.
0 голосов
/ 07 марта 2020

AnimalProcessingApplication класс должен быть на один уровень выше всех других классов.

Также вы используете new для создания объекта вместо использования Dependency Injection (autowiring).

Заменить ниже -

ProcessAnimal processAnimal = new ProcessAnimal();

на

@Autowired
ProcessAnimal processAnimal;

Также убедитесь, что ProcessAnimal является бобом и животным вводится в этом классе с использованием автоматической проводки.

0 голосов
/ 07 марта 2020

Приложение для обработки животных. java должно быть в папке root всех классов. Затем все компоненты в дочерних папках распознаются автоматически.

Обновление:
Создайте класс конфигурации с методом @Bean, чтобы создать экземпляр с Dog. Также вы можете избавиться от аннотации @Component класса. Проблема здесь заключается в том, что имя конструктора String не может быть введено.

Обновление 2:
Не создавайте экземпляры самостоятельно. Пусть весенний контейнер создаст их. Удалите метод запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...