java - spring "Manager"类中的 @Autowired 注解

标签 java spring rest spring-mvc

我在 spring 中遇到 @Autowired 注释的问题。 我有一个 RestController 类:

 package sptool.controller;

    @org.springframework.web.bind.annotation.RestController
public class CategoryController {

    @Autowired
    private CategoryManager categoryManager;

  //Methods
}

CategoryManager接口(interface):

package sptool.managers;
public interface CategoryManager {
    public void save(Category category);
    public Category getCategoryById(int id);
    public List<Category> getAllCategories();
    public void updateCategory(Category category);
    public void deleteCategory(int id);
}

CategoryManagerImpl 类:

package sptool.managers;
@Service
public class CategoryManagerImpl implements CategoryManager {

    @Autowired
    private CategoryDao categoryDao;
   //Methods
}

每次编译代码时都会出现异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'categoryController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private sptool.managers.CategoryManager sptool.controller.CategoryController.categoryManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [sptool.managers.CategoryManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

当我创建ApplicationContext并尝试获取categoryManagerImpl bean时,Bun没有问题:

applicationContext = new AnnotationConfigApplicationContext(ConfigurationClass.class);
application.getBean("controllerManagerImpl"); //<< works 

有人知道哪里可能有问题吗?

谢谢。

已添加

配置类:

package sptool.config;

@Configuration
@ComponentScan({"sptool.managers", "sptool.dao", "sptool.controller", "sptool.model"})
@PropertySource({"classpath:application.properties"})
public class ConfigurationClass {

    @Autowired
    private Environment env;

    @Bean(name = "dataSource")
    public DriverManagerDataSource dataSource()
    {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));

        return dataSource;
    }

    @Bean(name = "sessionFactory")
    public LocalSessionFactoryBean sessionFactoryBean()
    {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(env.getProperty("annotated.packages"));
        sessionFactory.setPackagesToScan( new String[] {"sprool.model"});
        sessionFactory.setHibernateProperties(hibernateProperties());

        return sessionFactory;
    }

    Properties hibernateProperties()
    {
        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect", env.getProperty("spring.jooq.sql-dialect"));
        properties.setProperty("hibernate.show_sql", env.getProperty("show.sql"));
        properties.setProperty("hibernate.current_session_factory", env.getProperty("current.session.class"));
        properties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));

        return properties;
    }

    @Bean(name = "transactionManager")
    @Autowired
    public HibernateTransactionManager hibernateTransactionManager(SessionFactory sessionFactory)
    {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory);
        return txManager;
    }

}

堆栈跟踪:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'categoryController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private sptool.managers.CategoryManager sptool.controller.CategoryController.categoryManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [sptool.managers.CategoryManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
        at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
        at sptool.controller.App.main(App.java:18) [classes/:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_91]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_91]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na]
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private sptool.managers.CategoryManager sptool.controller.CategoryController.categoryManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [sptool.managers.CategoryManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        ... 22 common frames omitted
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [sptool.managers.CategoryManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        ... 24 common frames omitted

最佳答案

尝试进行以下更改:

@Service
public interface CategoryManager {
    public void save(Category category);
    public Category getCategoryById(int id);
    public List<Category> getAllCategories();
    public void updateCategory(Category category);
    public void deleteCategory(int id);
}
@Component
public class CategoryManagerImpl implements CategoryManager {

    @Autowired
    private CategoryDao categoryDao;
   //Methods
}

您面临的问题是因为 spring 无法识别 bean CategoryManager,因为它没有使用 Service/Component 进行注释。执行上述操作应该可以解决这个问题。

仅供引用,如果您有多个 CategoryManager 实现,我建议您使用 @Component(value="myComponent") 包含实现的标识符

请告诉我这是否有帮助

关于java - spring "Manager"类中的 @Autowired 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37855723/

相关文章:

java - 当我尝试在 Spring Tool suite 4 中执行一个简单的程序时,它返回一个奇怪的错误

java - JasperReports 本地化

java - Spring 启动测试 : @TestPropertySource not overriding @EnableAutoConfiguration

Java - 避免创建空的子类和接口(interface)或生成 Java 源代码模板

rest - 什么是最好的 JAX-RS 库?

javascript - AngularJS 中 REST 资源的链接(关系)

java - 将虚拟文件夹添加到Web动态项目

java - 从整数中获取最低有效字节

java - 跨 Java 包 Autowiring Spring Beans

mysql - 默认情况下,Strongloop 环回应用程序是否使用多个进程?