В моем проекте 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, но это не помогло. Что еще я могу сделать?
Как вы запускаете приложение? Вы определили компонент как доступный в профиле "prod". Вы включили этот профиль? например --spring.profiles.active=prod как аргумент командной строки




Убедитесь, что профиль prod включен, например, через:
Свойство JVM:
-Dspring.profiles.active=prod
Или переменная среды:
export spring_profiles_active=prod
Или программно при создании ApplicationContext:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
//...........
ctx.getEnvironment().setActiveProfiles("prod");
ctx.refresh();
Вы также можете добавить его в файл application.properties, используя spring.profiles.active=prod.
Ну, application.properties из spring-boot. Я не вижу, чтобы @randomuser1 добавил тег spring-boot, поэтому я предполагаю, что это приложение без весенней загрузки, и я подозреваю, что application.properties будет работать весной из коробки...
В ответе, предоставленном @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 {
// ...
}
как ваши пружинные компоненты сканируются?