2016-04-20 5 views
1

У меня есть ошибка в Spring MVC:NoSuchBeanDefinitionException: Нет квалификационная боб

(org.springframework.beans.factory.BeanCreationException: Ошибка при создании боб с именем «webController»: Инъекции autowired зависимостей не удалось, вложенное исключение орг .springframework.beans.factory.BeanCreationException: Не удалось создать поле autowire: private com.nickolay.app.service.UserService com.nickolay.app.WebController.userService; вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: никакой квалификационный компонент типа [com.nickolay.app.service.UserService], найденного для зависимости: ожидается как минимум 1 компонент, который квалифицируется как кандидат на автоподключение для этой зависимости. Аннотации зависимостей)

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.nickolay.app.service.UserService com.nickolay.app.WebController.userService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.nickolay.app.service.UserService] 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) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4997) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5289) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3831) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5616) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.nickolay.app.service.UserService com.nickolay.app.WebController.userService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.nickolay.app.service.UserService] 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) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 31 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.nickolay.app.service.UserService] 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) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545) 
    ... 33 more 

My Controller (WebController.java):

@Controller 
public class WebController { 


    @Autowired 
    private UserService userService; 

................. 
} 

Мой UserService.java:

@Service 
public class UserService implements UserServiceInterface { 

    @Autowired 
    private UserDao userDao; 

    public void setUserDao(UserDao userDao) { 
     this.userDao = userDao; 
    } 

    @Override 
    @Transactional 
    public void create(User user) { 
     userDao.create(user); 
    } 
................ 
} 

Мой HibernateUserDao.java, который реализует UserDao:

@Repository("UserDao") 
public class HibernateUserDao implements UserDao { 

    @Autowired 
    SessionFactory sessionFactory; 

    public HibernateUserDao() { 
    } 

    @Override 
    @Transactional 
    public void create(User user) { 
     if (user == null) { 
      throw new NullPointerException(); 
     } 
     Session session = sessionFactory.getCurrentSession(); 
     session.save(user); 
    } 
............. 
} 

Мой сервлет -contents.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd" 


    <annotation-driven /> 

    <tx:annotation-driven /> 

    <resources mapping="/resources/**" location="/resources/" /> 


    <beans:bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

    <context:component-scan base-package="com.nickolay.app" /> 

    <beans:bean id="userDao" class="com.nickolay.app.dao.HibernateUserDao" /> 
    <beans:bean id="roleDao" class="com.nickolay.app.dao.HibernateRoleDao" /> 
    <beans:bean id="userService" class="com.nickolay.app.service.UserService"> 
    </beans:bean> 


</beans:beans> 

ответ

1

В этом случае вы не можете вводить конкретный класс UserService. Это связано с тем, что Spring создает прокси для вашего класса, чтобы обработать @Transactional. Поскольку ваша служба реализует интерфейс, Spring создает JXK-интерфейс, основанный на прокси-сервере. Прокси-сервер реализует UserServiceInterface и делегирует UserService. Следовательно, компонент, который управляет Spring, не является UserService, а UserServiceInterface

Существует два способа решить эту проблему. Проще всего изменить зависимость от UserService к UserServiceInterface

@Controller 
public class WebController { 

    @Autowired 
    private UserServiceInterface userService; 

} 

второй способ проинструктировать Spring использовать прокси-класс, основанный на CGLIB вместо прокси на основе интерфейса JDK. Измените tx: annotation-driven, чтобы указать proxy-target-class на true

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd" 


    <annotation-driven /> 

    <tx:annotation-driven proxy-target-class="true/> 

    <resources mapping="/resources/**" location="/resources/" /> 


    <beans:bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

    <context:component-scan base-package="com.nickolay.app" /> 

    <beans:bean id="userDao" class="com.nickolay.app.dao.HibernateUserDao" /> 
    <beans:bean id="roleDao" class="com.nickolay.app.dao.HibernateRoleDao" /> 
    <beans:bean id="userService" class="com.nickolay.app.service.UserService"> 
    </beans:bean> 


</beans:beans> 
+0

Большое спасибо! Большой! Можете ли вы порекомендовать мне весеннюю книгу? –

+0

Для меня лучшая документация - это сама ссылка Spring. Http://docs.spring.io/spring/docs/current/spring-framework-reference/pdf/spring-framework-reference.pdf –

Смежные вопросы