Spring Boot @autowired不起作用,类在不同的包中

时间:2015-12-19 04:39:19

标签: spring spring-mvc spring-boot

我有一个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;

如果它们在同一个包中,则可以使用。不确定原因

12 个答案:

答案 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);
    }

}