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



这是我的场景。我的项目使用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.bccommonsql.service.CommonSQLServicecom.ceiwc.ma.mvc.action.LoginAction.commonSQLService;嵌套异常是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.communsql.service.CommonSQLServicecom.ceiwc.ma.mvc.action.LoginAction.commonSQLService;嵌套异常是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.mvc.Action.LoginAction创建bean时出错name"com.ceiwc.ma.mvc.action.LoginAction":自动连线的注入依赖关系失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法autowire字段:专用com.ceiwc.bc.communsql.service.CommonSQLServicecom.ceiwc.ma.mvc.action.LoginAction.commonSQLService;嵌套异常是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

@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文件中包含的类不能自动连接吗?

感谢您的提前帮助!

@Service("CommonSQLService")更改为@Service("commonSQLService"),或者如果在其他地方没有实现CommonSQLService接口,则可以只使用@Service

最新更新