2016-06-16 14 views
1

Ich habe ein Problem mit @Autowired Annotation im Frühjahr. Ich habe eine RestController Klasse:@Autowired Annotation im Frühjahr "Manager" Klassen

package sptool.controller; 

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

    @Autowired 
    private CategoryManager categoryManager; 

    //Methods 
} 

CategoryManager Schnittstelle:

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 Klasse:

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

    @Autowired 
    private CategoryDao categoryDao; 
    //Methods 
} 

Jedes Mal, Code kompilieren bekomme ich eine Ausnahme:

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)} 

Brötchen, wenn ich Application erstellen und versuche categoryManagerImpl Bohne zu bekommen gibt es keine Probleme:

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

niemand weiß, wo ein Problem sein könnte?

Danke.

Added

Konfigurationsklasse:

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; 
    } 

} 

Stack Trace:

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 
+0

Haben Sie mehr als eine Impl-Klasse für 'CategoryManager' verwendet? –

+0

Nein, ich habe nur eine Klasse (CategoryManagerImpl), die CategoryManager-Schnittstelle implementiert. –

+0

In den aktuellen Spring-Versionen gibt es keine Anmerkung '@ SpringBean'. Wenn diese Anmerkung aus einer anderen Bibliothek stammt, fügen Sie bitte einige Links hinzu. – dunni

Antwort

0

Versuchen Sie, die folgenden Änderungen zu tun:

@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 
} 

Das Problem, mit dem Sie konfrontiert sind, liegt darin, dass spring den CategoryManager der Bean nicht erkennen kann, da er nicht mit Service/Komponente versehen ist. Das oben genannte sollte dieses Problem lösen.

Gerade FYI, wenn Sie mehr als eine Implementierungen für CategoryManager haben würde ich Ihnen empfehlen @Component eine Kennung für die Umsetzung enthalten unter Verwendung von (value = „myComponent“)

Lassen Sie mich wissen, ob das hilft

+0

Ich habe geändert CategoryManagerImpl zu: @Component (value = "categoryManager") public class CategoryManagerImpl implementiert CategoryManager {...} und CategoryManager zu: @Service public interface CategoryManager {...} Aber es hat nicht geholfen. –

+0

können Sie mir sagen, wie Ihre Konfiguration aussieht? Verwenden Sie die automatische Konfiguration? – koder23

+0

Bitte teilen Sie auch den gesamten Call-Stack – koder23

0

Seit dieser CategoryManagerImpl mit @Service bezeichnet ist, brauchen Sie nicht es im Frühjahr wieder Servlet zu erklären (wie < bean class="..CategoryManagerImpl " >), das sonst im Frühjahr Servlet entfernen Sie es nicht die Bohne qualifiziert werden kann, injizieren, um es zu CategoryManager und nach dem Entfernen, müssen Sie auch entfernen:

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

Und schließlich diese CategoryManager wird von CategoryManagerImpl ganz gut injiziert werden.

Verwandte Themen