Struts2 & Spring 错误:没有为依赖找到符合条件的 bean

Posted

技术标签:

【中文标题】Struts2 & Spring 错误:没有为依赖找到符合条件的 bean【英文标题】:Struts2 & Spring error: No qualifying bean of type found for dependency 【发布时间】:2013-06-28 22:03:29 【问题描述】:

我的项目正在使用 Spring 3.2 和 Struts2(都使用注释)。我正在通过 Java 配置 Spring。当我尝试将服务注入到操作中时,我从 Struts2 收到以下错误:

    没有为依赖找到类型为 [com.ceiwc.mvc.service.IUserService] 的合格 bean:预计至少有 1 个符合条件的 bean 此依赖项的自动装配候选者。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

    无法自动装配字段:私有 com.ceiwc.mvc.service.IUserService com.ceiwc.mvc.action.LoginAction.userService;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为 [com.ceiwc.mvc.service.IUserService] 找到了符合条件的 bean 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

    创建名为“com.ceiwc.mvc.action.LoginAction”的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 com.ceiwc.mvc.service.IUserService com.ceiwc.mvc.action.LoginAction.userService;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为 [com.ceiwc.mvc.service.IUserService] 找到了符合条件的 bean 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

    无法实例化 Action,com.ceiwc.mvc.action.LoginAction,为命名空间 '/Login' 中的 'login' 定义使用名称创建 bean 时出错 'com.ceiwc.mvc.action.LoginAction':自动装配的注入 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 com.ceiwc.mvc.service.IUserService com.ceiwc.mvc.action.LoginAction.userService;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为 [com.ceiwc.mvc.service.IUserService] 找到了符合条件的 bean 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

这里是堆栈跟踪:

无法实例化Action,com.ceiwc.mvc.action.LoginAction, 为命名空间“/Login”中的“登录”定义创建具有名称的 bean 时出错 'com.ceiwc.mvc.action.LoginAction':自动装配的注入 依赖失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 com.ceiwc.mvc.service.IUserService com.ceiwc.mvc.action.LoginAction.userService;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为 [com.ceiwc.mvc.service.IUserService] 找到了符合条件的 bean 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:316)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:397)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:536)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.ceiwc.mvc.action.LoginAction': Injection

自动装配依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 自动装配字段:私有 com.ceiwc.mvc.service.IUserService com.ceiwc.mvc.action.LoginAction.userService;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为 [com.ceiwc.mvc.service.IUserService] 找到了符合条件的 bean 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:376)
com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(SpringObjectFactory.java:203)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:183)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:154)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:121)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:297)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:397)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:536)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
 org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.ceiwc.mvc.service.IUserService

com.ceiwc.mvc.action.LoginAction.userService;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 否 为 [com.ceiwc.mvc.service.IUserService] 找到了符合条件的 bean 依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514)
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:376)
com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(SpringObjectFactory.java:203)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:183)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:154)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:121)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:297)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:397)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:536)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.ceiwc.mvc.service.IUserService] found

对于依赖项:预计至少有 1 个符合自动装配条件的 bean 这种依赖的候选人。依赖注解: @org.springframework.beans.factory.annotation.Autowired(required=true)

org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:986)
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856)
org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486)
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1116)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:376)
com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(SpringObjectFactory.java:203)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:183)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:154)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:121)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:297)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:397)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:536)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
weblogic.work.ExecuteThread.run(ExecuteThread.java:178)

这是 Spring 的 Java 配置:

@Configuration
@ImportResource( "/WEB-INF/spring/spring-config.xml" )
@ComponentScan(basePackages = "com.ceiwc")
public class ApplicationConfig 



@Configuration
@EnableTransactionManagement
@Import(ApplicationConfig.class)
@PropertySource( "classpath:db.properties" )
public class DataConfig 

    @Autowired
    Environment environment;

    @Bean
    public DriverManagerDataSource dataSource() 
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getProperty("db.driver"));
        dataSource.setUrl(environment.getProperty("db.url"));
        dataSource.setUsername(environment.getProperty("db.username"));
        dataSource.setPassword(environment.getProperty("db.password"));
        return dataSource;
    

    @Bean
    public JpaVendorAdapter vendorAdapter() 
        EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.ORACLE);
        vendorAdapter.setShowSql(true);
        return vendorAdapter;
    

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() 

        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPackagesToScan(new String[]  environment
                .getProperty("db.packagesToScan") );
        entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter());

        return entityManagerFactoryBean;
    

    @Bean
    public PlatformTransactionManager transactionManager() 
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactoryBean()
                .getObject());
        return transactionManager;
    

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() 
        return new PersistenceExceptionTranslationPostProcessor();
    

这是我的 DAO:

public interface IUserDao extends IGenericDao<User> 
    public User findUserByUsernameAndPassword(String username, String password);


@Repository("userDAO")
@Transactional(readOnly = true)
public class UserDaoImpl extends GenericDaoImpl<User> implements IUserDao 

    @Override
    public User findUserByUsernameAndPassword(String username, String password) 

        Query query = getEntityManager()
                .createNativeQuery(
                        "Select u From User Where username = :username And password = :password");
        query.setParameter("username", username);
        query.setParameter("password", password);

        return (User) query.getSingleResult();
    

这是我的服务:

public interface IUserService 
    public User validateUser(String username, String password);


@Service("userService")   
public class UserServiceImpl implements IUserService 

    @Autowired
    private IUserDao userDao;

    @Override
    public User validateUser(String username, String password) 
        return userDao.findUserByUsernameAndPassword(username, password);
    


这是我的行动:

@SuppressWarnings("serial")
@Namespace("/Login")
@Component
public class LoginAction extends ActionSupport 

    private User user;
    private String updateFlag;

    @Autowired
    private IUserService userService;

    @Action(value = "login", results =  @Result(name = "success", location = "/pages/login/login.jsp") )
    public String login() 
        updateFlag = "Y";
        return SUCCESS;
    

    @Action(value = "validate", results = 
            @Result(name = "success", location = "/pages/menu/index.jsp"),
            @Result(name = "login", location = "/pages/login/login.jsp") )
    public String validateUser() 
        if (updateFlag == null) 
            return LOGIN;
        

        if (userService.validateUser(user.getUsername(), user.getPassword()) == null) 
            addActionError("You are an invalid user");
            return LOGIN;
        

        // TODO: Add session aware info
        return SUCCESS;
    

    public User getUser() 
        return user;
    

    public void setUser(User user) 
        this.user = user;
    

    public String getUpdateFlag() 
        return updateFlag;
    

    public void setUpdateFlag(String updateFlag) 
        this.updateFlag = updateFlag;
    

    public IUserService getUserService() 
        return userService;
    

    public void setUserService(IUserService userService) 
        this.userService = userService;
    


这是我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>menuAdministration</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- Helps with wiring the application together -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Needed to manage the Java based @Configuration classes for Spring -->
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
         org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.ceic.config</param-value>
    </context-param>

    <!-- Handles Strut2 URL requests -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

我错过了什么?我有@Component@Service@Repository 的刻板印象。所以,我不明白为什么 Spring 找不到我的 bean 进行注入。

【问题讨论】:

我在您的代码中看不到任何明显的缺陷。您可以在 IDE 中尝试清理/重建/重新部署,以查看 WEB-INF/classes 中是否缺少某些类。 @Guillaume,当我检查我的 .war 文件时,我看到类在那里。这就是为什么我对为什么 Spring 没有看到 bean 感到困惑。 Spring 容器是否被引导? @NuAlphaMan 你能发布一个 web.xml 和/或 spring-config.xml 吗? @RomanC,web.xml 已发布。我的 spring-config.xml 目前是空白的,因为我正在使用注释。我把它留给那些追随我并且可能更喜欢 XML 的人。 【参考方案1】:

我找到了两个解决这个问题的方法。

    由于我为 Spring 使用 Java 配置,我必须确保我的 contextConfigLocation 设置正确。 我正在使用一个 jar 文件,其中包含带有 Spring 原型的 bean,因此我必须确保 jar 文件正确地内置在 eclipse 中。在构建 jar 文件时,我必须确保选中了“添加目录条目”选项。

这两步解决了这个问题。

【讨论】:

以上是关于Struts2 & Spring 错误:没有为依赖找到符合条件的 bean的主要内容,如果未能解决你的问题,请参考以下文章

Spring:Spring&Struts2&Hibernate搭建的blog项目

在TOMCAT下没有问题; 使用的STRUTS2, SPRING, JDK1.6 但发布到WAS就出现如下错误;

Struts2&Hibernate&Spring框架目录

Struts2如何实现Struts2与Spring的整合 外加 MyBatis 框架

struts2+hibernate+spring简单整合且java.sql.SQLException: No suitable driver 问题解决

spring与struts2整合出现错误HTTP Status 500 - Unable to instantiate Action