代码之家  ›  专栏  ›  技术社区  ›  NuAlphaMan

Spring Autowire失败,找不到符合条件的类型的bean以进行依赖性错误

  •  4
  • NuAlphaMan  · 技术社区  · 11 年前

    这是我的场景。我的项目使用Spring(3.2.3.REASE)、Struts2(2.3.14.3)和JPA(2.0)。我们有一个项目(我们称之为项目a),它包含各种实体和公共类。我们使用项目A生成一个.jar文件,以便其他项目可以使用这些类。在项目A中,我们使用了Spring原型:@Component@Service或@Repository,用于我们希望Spring注入的类。每当我们试图从jar中注入bean时,我们都会收到类似以下的错误:

    1. 没有类型的合格bean 为找到了[ceiwc.bc.commonsql.service.CommonSQLService] 依赖项:需要至少1个符合autowire条件的bean 此依赖项的候选项。依赖项注释: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

    2. 无法自动连接字段:private com.ceiwc.bc.commmonsql.service.CommonSQLService com.ceiwc.ma.mvc.action.LoginAction.commonSQL服务;嵌套异常 是org.springframework.beans.factory.NoSuchBeanDefinitionException:否 类型的合格bean 为找到了[ceiwc.bc.commonsql.service.CommonSQLService] 依赖项:需要至少1个符合autowire条件的bean 此依赖项的候选项。依赖项注释: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

    3. 创建名为“com.ceiwc.ma.mvc.action.LoginAction”的bean时出错:注入autowired 依赖关系失败;嵌套异常为 org.springframework.beans.factory.BeanCreationException:无法 autowire字段:专用 com.ceiwc.bc.commmonsql.service.commonsql服务 com.ceiwc.ma.mvc.action.LoginAction.commonSQL服务;嵌套异常 是org.springframework.beans.factory.NoSuchBeanDefinitionException:否 类型的合格bean 为找到了[ceiwc.bc.commonsql.service.CommonSQLService] 依赖项:需要至少1个符合autowire条件的bean 此依赖项的候选项。依赖项注释: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

    4. 无法实例化命名空间“/Login”中为“doLogin”定义的操作com.ceiwc.ma.mvc.Action.LoginAction创建bean时出错 name“com.ceiwc.ma.mvc.action.LoginAction”:自动连线的注入 依赖关系失败;嵌套异常为 org.springframework.beans.factory.BeanCreationException:无法 autowire字段:专用 com.ceiwc.bc.commmonsql.service.commonsql服务 com.ceiwc.ma.mvc.action.LoginAction.commonSQL服务;嵌套异常 是org.springframework.beans.factory.NoSuchBeanDefinitionException:否 类型的合格bean 为找到了[ceiwc.bc.commonsql.service.CommonSQLService] 依赖项:需要至少1个符合autowire条件的bean 此依赖项的候选项。依赖项注释: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

    我们正在为Spring使用Java配置。这是我们的配置类:

    package com.zzz.bc.config;
    
    @Configuration
    @ImportResource({"/WEB-INF/spring/spring-config.xml"})
    @ComponentScan(basePackages = "com.zzz")
    public class ApplicationConfig {
        @Bean
        public JavaMailSender mailSender() {
            JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
            mailSender.setHost(${app.mail.host});
            return mailSender;
        }
    }
    
    package com.zzz.bc.config;
    
    @Configuration
    @EnableTransactionManagement
    @Import(ApplicationConfig.class)
    @PropertySource({"classpath:db.properties"})
    public class DataConfig {
    
        @Autowired
        Environment environment;
    
        @Bean
        public PlatformTransactionManager transactionManager() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
            return transactionManager;
        }
    
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
            String[] packagesToScan =
                    {environment.getProperty("db.packagesToScan1"), environment.getProperty("db.packagesToScan2")};
    
            Map<String, Object> jpaProperties = new HashMap<String, Object>();
            jpaProperties.put("eclipselink.weaving", "false");
    
            LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
            entityManagerFactoryBean.setDataSource(dataSource());
            entityManagerFactoryBean.setPackagesToScan(packagesToScan);
            entityManagerFactoryBean.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
            entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter());
            entityManagerFactoryBean.setJpaPropertyMap(jpaProperties);
    
            return entityManagerFactoryBean;
        }
    
        @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 PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
            return new PersistenceExceptionTranslationPostProcessor();
        }
    }
    

    我们在com.zzz的包中设置了@ComponentScan来检查bean。在项目B中,我们有一个Struts2 Action,我们想从项目a中注入一个bean。以下是项目B中的类片段:

    @SuppressWarnings("rawtypes")
    @Service("CommonSQLService")
    public class CommonSQLServiceImpl implements CommonSQLService {
    
        @Autowired
        CommonSQLDao cdao;
    
        @Override
        public Policy getPolicyById(String policyNo) {
            return cdao.getPolicyById(policyNo);
        }
    
        @Override
        public Policy getPolicy(Policy parmRec) {
            return cdao.getPolicy(parmRec);
        }
    
        @Override
        public ArrayList<Policy> getPolicies(String policyNo) {
            return cdao.getPolicies(policyNo);
        }
        @Override
         public List<Policy> getPolicies(Policy parmRec){
            return cdao.getPolicies(parmRec);
        }
    }
    

    以下是我们的操作(删除getter/setter):

    package com.zzz.ma.mvc.action;
    
    @SuppressWarnings("serial")
    @Component
    @Scope("prototype")
    @Namespace("/Login")
    public class LoginAction extends ActionParent {
        @Autowired
        private IUserService userService; //Contained in project B
    
        @Autowired
        private CommonSQLService commonSQLService; //What's autowired from project A
    
        private User user;
        private String updateFlag;
        private Integer parentMenuId;
        private IwifWebNavmenuItem record;
    
        public static final String LOGIN_STR = "login";
    
        @Action(value = "doLogin", results = { @Result(name = "success", location = "/pages/login.jsp") })
        public String login() {
            updateFlag = "Y";
            return SUCCESS;
        }
    
        @Action(value = "validate", results = {
                @Result(name = "success", location = "/BrowseOptions/showOptions", type = "redirect"),
                @Result(name = "login", location = "/pages/login.jsp") })
        public String validateUser() {
            if (updateFlag == null) {
                session.remove(LOGIN_STR);
                return LOGIN;
            }
    
            if (userService.validateUser(user.getUsername(), user.getPassword()) == null) {
                addActionError(getText("invalid.user"));
                return LOGIN;
            }
    
            session.put(LOGIN_STR, user.getUsername());
    
            return SUCCESS;
        }
    
        @Action(value = "logout", results = { @Result(name = "success", location = "/pages/login.jsp") })
        public String logout() {
            updateFlag = StringUtils.EMPTY;
            session.invalidate();
    
            return SUCCESS;
        }
    }
    

    每当我们试图进行这种自动布线时,我们都会遇到上面列出的错误。我们缺少什么?Spring Stereotypes的jar文件中包含的类不能自动连接吗?

    感谢您的提前帮助!

    1 回复  |  直到 11 年前
        1
  •  5
  •   Diego Urenia    11 年前

    改变 @Service("CommonSQLService") @Service("commonSQLService") 或者你可以使用 @Service 如果您没有实现 CommonSQLService 其他任何地方的接口。