@Repository的@Autowire失败了

时间:2016-08-15 16:25:28

标签: java spring

我是一名java开发人员,他使用的是一家公司所需的自定义框架,该框架基于Spring。我设法使它的旧版本工作,但这个新版本的问题与我的@Repository有关,尽管正在扫描bean,但它无法成为@Autowired。

这是错误

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobInvoiceServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private foo.repository.impl.JobInvoiceRepositoryImpl foo.service.impl.JobInvoiceServiceImpl.jobInvoiceRepositoryImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [foo.repository.impl.JobInvoiceRepositoryImpl] 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.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5003)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private foo.repository.impl.JobInvoiceRepositoryImpl foo.service.impl.JobInvoiceServiceImpl.jobInvoiceRepositoryImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [foo.repository.impl.JobInvoiceRepositoryImpl] 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)
    ... 22 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [foo.repository.impl.JobInvoiceRepositoryImpl] 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)
    ... 24 more

Aug 15, 2016 5:09:17 PM com.sun.faces.config.ConfigureListener contextInitialized
INFO: Initializing Mojarra 2.2.5 ( 20140108-1427 https://svn.java.net/svn/mojarra~svn/tags/2.2.5@12761) for context '/invoicer-application-war'
0    [localhost-startStop-1] WARN  org.springframework.web.context.support.XmlWebApplicationContext  - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobInvoiceServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private foo.repository.impl.JobInvoiceRepositoryImpl foo.service.impl.JobInvoiceServiceImpl.jobInvoiceRepositoryImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [foo.repository.impl.JobInvoiceRepositoryImpl] 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)}
19   [localhost-startStop-1] ERROR org.springframework.web.context.ContextLoader  - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobInvoiceServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private foo.repository.impl.JobInvoiceRepositoryImpl foo.service.impl.JobInvoiceServiceImpl.jobInvoiceRepositoryImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [foo.repository.impl.JobInvoiceRepositoryImpl] 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.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5003)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private foo.repository.impl.JobInvoiceRepositoryImpl foo.service.impl.JobInvoiceServiceImpl.jobInvoiceRepositoryImpl; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [foo.repository.impl.JobInvoiceRepositoryImpl] 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)
    ... 22 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [foo.repository.impl.JobInvoiceRepositoryImpl] 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)
    ... 24 more

这是应用程序代码:

@Controller

package foo.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import foo.domain.JobInvoiceBean;
import foo.service.impl.JobInvoiceServiceImpl;

@SuppressWarnings("unused")
@Component
@Scope("view")
public class InvoiceSearchController implements Serializable {

    private static final long serialVersionUID = -1124694025090601008L;

    private List<JobInvoiceBean> jobInvoiceList = new ArrayList<JobInvoiceBean>();
    private List<JobInvoiceBean> filteredJobInvoices = new ArrayList<JobInvoiceBean>();

    private JobInvoiceBean selectedJobInvoice;

    @Autowired
    private JobInvoiceServiceImpl jobInvoiceServiceImpl;

    public void init() {
        List<JobInvoiceBean> jobInvoiceList = jobInvoiceServiceImpl.getAllJobInvoice();
    }


//  public void getJobInvoiceDetail() {
//      getJobInvoiceDetail(this.selectedJobInvoice);
//  }
//  
//  private void getJobInvoiceDetail(JobInvoiceBean jobInvoiceBean){
//      //This is essentially just a re-fetch
//      JobInvoiceBean jobInvoice = jobInvoiceService.findJobInvoiceById(jobInvoiceBean.getInvoiceNo());
//      
//      jobInvoiceBean = jobInvoice;
//  }

    /*
    public void onPropertyEdit(CellEditEvent event) {

        DataTable dataTable = (DataTable) event.getSource();
        PropertyBean modifiedProperty = (PropertyBean) dataTable.getRowData();

        Property property = jobInvoiceService.findPropertyById(modifiedProperty.getId());
        BeanUtils.copyProperties(modifiedProperty, property, "surface", "addresses");
        property.setSurface(BigDecimal.valueOf(modifiedProperty.getSurface()));

        jobInvoiceService.saveOrUpdateProperty(property);

        FacesMessage msg = new FacesMessage(
                getBundleMessage("property.edition.message"),
                modifiedProperty.getName());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    */

    public JobInvoiceBean getSelectedJobInvoice() {
        return selectedJobInvoice;
    }

    public void setSelectedJobInvoice(JobInvoiceBean selectedJobInvoice) {
        this.selectedJobInvoice = selectedJobInvoice;
    }


    public List<JobInvoiceBean> getJobInvoiceList() {
        return jobInvoiceList;
    }


    public void setJobInvoiceList(List<JobInvoiceBean> jobInvoiceList) {
        this.jobInvoiceList = jobInvoiceList;
    }


    public List<JobInvoiceBean> getFilteredJobInvoices() {
        return filteredJobInvoices;
    }


    public void setFilteredJobInvoices(List<JobInvoiceBean> filteredJobInvoices) {
        this.filteredJobInvoices = filteredJobInvoices;
    }


}

@服务

package foo.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import foo.domain.JobInvoiceBean;
import foo.repository.impl.JobInvoiceRepositoryImpl;
import foo.service.JobInvoiceService;

@Service
public class JobInvoiceServiceImpl implements JobInvoiceService {

    @Autowired
    private JobInvoiceRepositoryImpl jobInvoiceRepositoryImpl;

    @Override
    public List<JobInvoiceBean> getAllJobInvoice() {
        return jobInvoiceRepositoryImpl.getAllInvoices();
    }

}

@Repository

package foo.repository.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.convert.ConversionService;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import foo.domain.JobInvoiceBean;
import foo.repository.CustomJobInvoiceRepository;

@Transactional(readOnly = true)
@SuppressWarnings("unchecked")
@Repository
public class JobInvoiceRepositoryImpl implements CustomJobInvoiceRepository {

    private static final Logger LOGGER = LoggerFactory.getLogger(JobInvoiceRepositoryImpl.class);

    private BeanPropertyRowMapper<JobInvoiceBean> invoiceRowMapper;

    private SimpleJdbcCall simpleJdbcCall;
    private DataSource dataSource;

    @Override
    public List<JobInvoiceBean> getAllInvoices() {
        List<JobInvoiceBean> listInvoice = new ArrayList<JobInvoiceBean>();
        try{
            simpleJdbcCall = new SimpleJdbcCall(dataSource);

            simpleJdbcCall.withCatalogName("invoicer_pkg")
                        .withFunctionName("get_job_invs")
                        .returningResultSet("ret_cursor", invoiceRowMapper);

//          SqlParameterSource in = new MapSqlParameterSource()
//              .addValue("clientReference", clientReference)
//              .addValue("hasChildren", hasChildren ? "Y" : "N");

            Map<String, Object> result = simpleJdbcCall.execute();          

            if (result != null && result.size() > 0) {
                listInvoice = (List<JobInvoiceBean>) result.get("ret_cursor");
            }

        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }       
        return listInvoice;
    }

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Autowired
    public void setConversionService(final ConversionService conversionService) {
        this.invoiceRowMapper = new BeanPropertyRowMapper<JobInvoiceBean>(JobInvoiceBean.class);        
    }
}

我可能会遗漏一些东西,但我无法看到它。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的JobInvoiceRepositoryImpl类实现CustomJobInvoiceRepository接口,并使用@Transactional进行批注。

Spring AOP Transactional基础结构检测到它的事务性并创建一个事务性JDK代理,该代理实现CustomJobInvoiceRepository并委托给JobInvoiceRepositoryImpl。

应用程序上下文中的实际bean不再是JobInvoiceRepositoryImpl而是代理。

你不能注入JobInvoiceRepositoryImpl而是使用如下界面

@Service
public class JobInvoiceServiceImpl implements JobInvoiceService {

    @Autowired
    private CustomJobInvoiceRepository jobInvoiceRepository;

    @Override
    public List<JobInvoiceBean> getAllJobInvoice() {
        return jobInvoiceRepository.getAllInvoices();
    }

}

否则指示Spring使用CGLIB例如

来使用基于类的代理
@EnableTransactionManagement(proxyTragetClass = true) 

或xml中的等价

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