Поле требует бин типа ... который не может быть найден - PullRequest
0 голосов
/ 27 февраля 2019

В моем 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, но это не помогло.Что еще я могу сделать?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

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

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

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

@Component
@Profile("!prod") // second implementation, used if 'prod' is not active
public class MyImplementationClass implements MyInterface {
    // ...
}
0 голосов
/ 27 февраля 2019

Убедитесь, что профиль 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();
    
...