我有一个Spring启动应用程序。
我收到以下错误
org.springframework.beans.factory.BeanCreationException:错误 创建名为'birthdayController'的bean:注入自动装配 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire字段:private com.esri.birthdays.dao.BirthdayRepository com.esri.birthdays.controller.BirthdayController.repository;嵌套 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 [com.esri.birthdays.dao.BirthdayRepository]类型的限定bean 找到依赖:预计至少有1个bean符合条件 autowire候选人这种依赖。依赖注释: {@ org.springframework.beans.factory.annotation.Autowired(所需=真)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 〜[弹簧豆-4.2.4.RELEASE.jar:4.2.4.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 〜[弹簧豆-4.2.4.RELEASE.jar:4.2.4.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 〜[弹簧豆-4.2.4.RELEASE.jar:4.2.4.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 〜[弹簧豆-4.2.4.RELEASE.jar:4.2.4.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306) 〜[弹簧豆-4.2.4.RELEASE.jar:4.2.4.RELEASE] 在或
以下是我的Repository类的代码
package com.esri.birthdays.dao;
import com.esri.birthdays.model.BirthDay;
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
public BirthDay findByFirstName(String firstName);
}
以下是控制器。
package com.esri.birthdays.controller;
@RestController
public class BirthdayController {
@Autowired
private BirthdayRepository repository;
如果它们在同一个包中,则可以使用。不确定原因
答案 0 :(得分:56)
在示例包
中使用@SpringBootApplication注释时com.company.config
它将自动进行组件扫描:
@ComponentScan("com.company.config")
所以它不会扫描com.company.controller之类的软件包等。这就是为什么你必须在普通包之前将包中的@SpringBootApplication声明为:com.company或者使用scanBasePackages属性,如下所示:
@SpringBootApplication(scanBasePackages = { "com.company" })
OR componentScan:
@SpringBootApplication
@ComponentScan("com.company")
答案 1 :(得分:4)
只需将包放在@SpringBootApplication标记内。
@SpringBootApplication(scanBasePackages = { "com.pkg1", "com.pkg2", .....})
让我知道。
答案 2 :(得分:3)
尝试使用@ComponentScan("com.esri.birthdays")
注释注释配置类。
一般来说:如果您的项目中有子包,那么您必须在项目根目录上扫描相关的类。我想你的情况就是“com.esri.birthdays”。
如果项目中没有子包装,则不需要ComponentScan。
答案 3 :(得分:2)
对于这类问题,我最终在新创建的服务类上添加了@Service
注释,然后选择了自动装配。
因此,尝试检查那些未获得自动装配的类,如果他们需要应用相应的必需注释(如@Controller
,@Service
等),然后再尝试构建项目。
答案 4 :(得分:1)
在我的情况下,@component
无效,因为我使用new <classname>()
初始化了该类实例。
如果我们在代码中的任何地方用传统的Java方式初始化实例,那么spring就不会在IOC容器中添加该组件。
答案 5 :(得分:1)
默认情况下,在Spring引导应用程序中,组件扫描是在主类所在的包内进行的。不在包之外的任何bean都不会创建,因此会产生上述异常。
解决方案:您可以将bean移到主要的spring boot类(这不是一个好方法),也可以创建一个单独的配置文件并将其导入:
@Import({CustomConfigutation1.class, CustomConfiguration2.class})
@SpringBootpplication
public class BirthdayApplication {
public static void main(String [] args) {
springApplication.run(BirthdayApplication.class, args );
}
}
将bean添加到这些CustomConfiguration文件中。
答案 6 :(得分:0)
试试这个:
@Repository
@Qualifier("birthdayRepository")
public interface BirthdayRepository extends MongoRepository<BirthDay,String> {
public BirthDay findByFirstName(String firstName);
}
注入bean时:
@Autowired
@Qualifier("birthdayRepository")
private BirthdayRepository repository;
如果没有,请检查配置中的 CoponentScan 。
答案 7 :(得分:0)
肯定会有一个bean,其中也包含与Birthday有关的字段 因此,使用它,您的问题将得到解决
@SpringBootApplication
@EntityScan("com.java.model*") // base package where bean is present
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
答案 8 :(得分:0)
我有同样的问题。当我从Autowired对象中删除private修饰符时,它对我有用。
答案 9 :(得分:0)
package com.test.springboot;
@SpringBootApplication
@ComponentScan(basePackages = "com.test.springboot")
public class SpringBoot1Application {
public static void main(String[] args) {
ApplicationContext context= SpringApplication.run(SpringBoot1Application.class, args);
================================================ =====================
package com.test.springboot;
@Controller
public class StudentController {
@Autowired
private StudentDao studentDao;
@RequestMapping("/")
public String homePage() {
return "home";
}
答案 10 :(得分:0)
另一种有趣的解决方法是注释setter方法的参数。似乎对于setter方法(与构造方法不同),您必须对方法进行整体注释。
这对我不起作用:
public void setRepository(@Autowired WidgetRepository repo)
但是这样做:
@Autowired public void setRepository(WidgetRepository repo)
(Spring Boot 2.3.2)
答案 11 :(得分:0)
当我添加@ComponentScan("com.firstday.spring.boot.services")
或scanBasePackages{"com.firstday.spring.boot.services"}
时,不会加载jsp。因此,当我在@SpringBootApplication类中添加项目的父包时,在我的情况下效果很好
代码示例:-
package com.firstday.spring.boot.firstday;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"com.firstday.spring.boot"})
public class FirstDayApplication {
public static void main(String[] args) {
SpringApplication.run(FirstDayApplication.class, args);
}
}