简体   繁体   English

NoSuchBeanDefinitionException: 没有合格的 bean

[英]NoSuchBeanDefinitionException: No qualifying bean

I have an error in Spring mvc:我在 Spring mvc 中有一个错误:

(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.BeanCreationException:创建名为“webController”的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.nickolay.app .service.UserService com.nickolay.app.WebController.userService; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 找不到类型 [com.nickolay.app.service.UserService] 的合格 bean 依赖项:至少预期1 个有资格作为此依赖项的自动装配候选者的 bean。依赖项注释)

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):我的控制器(WebController.java):

@Controller
public class WebController {


    @Autowired
    private UserService userService;

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

My UserService.java:我的 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);
    }
................
}

My HibernateUserDao.java, which implements UserDao:我的 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);
    }
.............
}

My servlet-contents.xml我的 servlet-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>

You cannot inject the concrete class UserService in this case.在这种情况下,您不能注入具体类 UserService。 This is because Spring is creating a proxy for your class in order to handler @Transactional.这是因为 Spring 正在为您的类创建代理以处理 @Transactional。 Since your service implements an interface Spring is creating a JDK interface based proxy ie the proxy implements UserServiceInterface and delegates to UserService.由于您的服务实现了一个接口 Spring 正在创建一个基于 JDK 接口的代理,即代理实现 UserServiceInterface 并委托给 UserService。 Hence the bean that Spring manages is not a UserService but a UserServiceInterface因此 Spring 管理的 bean 不是 UserService 而是 UserServiceInterface

There are two ways to solve this.有两种方法可以解决这个问题。 The simplest is to change your dependency from UserService to UserServiceInterface最简单的是将您的依赖项从 UserService 更改为 UserServiceInterface

@Controller
public class WebController {

    @Autowired
    private UserServiceInterface userService;

}

The second way is to instruct Spring to use CGLIB class based proxies instead of JDK interface based proxies.第二种方法是指示 Spring 使用基于 CGLIB 类的代理而不是基于 JDK 接口的代理。 Change your tx:annotation-driven to specify proxy-target-class to true更改您的 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 NoSuchBeanDefinitionException:没有类型合格的bean(存储库) - NoSuchBeanDefinitionException: No qualifying bean of type (repository) NoSuchBeanDefinitionException:找不到类型合格的bean - NoSuchBeanDefinitionException: No qualifying bean of type found NoSuchBeanDefinitionException: 没有“XInterceptor”类型的合格 bean - NoSuchBeanDefinitionException: No qualifying bean of type "XInterceptor" NoSuchBeanDefinitionException: 没有“int”类型的合格 bean - NoSuchBeanDefinitionException: No qualifying bean of type 'int' Spring Data Redis NoSuchBeanDefinitionException:没有类型的限定bean - Spring Data Redis NoSuchBeanDefinitionException: No qualifying bean of type NoSuchBeanDefinitionException:没有内部类的合格 bean - NoSuchBeanDefinitionException: No qualifying bean of type for inner class NoSuchBeanDefinitionException:未找到依赖关系类型为JpaVendorAdapter的合格Bean - NoSuchBeanDefinitionException: No qualifying bean of type JpaVendorAdapter found for dependency NoSuchBeanDefinitionException:没有要自动装配的JobLauncher类型的合格Bean - NoSuchBeanDefinitionException: No qualifying bean of type JobLauncher to autowire NoSuchBeanDefinitionException:没有符合条件的 bean 类型(JpaRepository 和 Java Config) - NoSuchBeanDefinitionException: No qualifying bean of type (JpaRepository and Java Config) 如何解决“ NoSuchBeanDefinitionException:没有类型的合格bean”错误? - How to cure 'NoSuchBeanDefinitionException: No qualifying bean of type' error?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM