Поле требует bean-компонента типа ..., который не может быть найден

В моем проекте Spring у меня есть интерфейс:

public interface MyIntefrace {

    void myMethod(String myParam);
}

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

@Component
@Profile("prod")
public class MyImplementationClass implements MyInterface {
    ...

В моем другом классе я использую этот объект следующим образом:

@Autowired
MyInterface myinterface;

...

myinterface.myMethod(someParam);

И мне выдает ошибку:

Field myinterface in mypackage required a bean of type ... that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)

Consider defining a bean of type '...' in your configuration

Я пытался добавить аннотацию @Service выше MyInterface, но это не помогло. Что еще я могу сделать?

как ваши пружинные компоненты сканируются?

user7294900 27.02.2019 09:58

Как вы запускаете приложение? Вы определили компонент как доступный в профиле "prod". Вы включили этот профиль? например --spring.profiles.active=prod как аргумент командной строки

Dan_Maff 27.02.2019 09:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
1 099
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Убедитесь, что профиль prod включен, например, через:

  1. Свойство JVM:

    -Dspring.profiles.active=prod

  2. Или переменная среды:

    export spring_profiles_active=prod

  3. Или программно при создании ApplicationContext:

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    //...........
    ctx.getEnvironment().setActiveProfiles("prod");
    ctx.refresh();
    

Вы также можете добавить его в файл application.properties, используя spring.profiles.active=prod.

Glains 27.02.2019 10:14

Ну, application.properties из spring-boot. Я не вижу, чтобы @randomuser1 добавил тег spring-boot, поэтому я предполагаю, что это приложение без весенней загрузки, и я подозреваю, что application.properties будет работать весной из коробки...

Ken Chan 27.02.2019 10:17

В ответе, предоставленном @KenChan, уже упоминалось жизнеспособное решение, но я хотел добавить некоторые дополнительные детали. В настоящее время у вас есть только одна реализация MyIntefrace, которая также снабжена аннотацией @Profile. Если вы не запускаете свое приложение с использованием этого профиля, все другие компоненты, которые зависят от этого компонента (и не могут быть внедрены с помощью внедрения геттера/сеттера), не могут быть созданы.

Я рекомендую вам либо создать вторую реализацию, которая будет внедрена, если ваш профиль не активирован, либо аннотировать все зависимые компоненты с этим профилем.

@Component
@Profile("prod")
public class MyImplementationClass implements MyInterface {
    // ...
}

@Component
@Profile("!prod") // second implementation, used if 'prod' is not active
public class MyImplementationClass implements MyInterface {
    // ...
}

Другие вопросы по теме