2017-10-21 6 views
1

Ich habe mein Projekt gestartet, indem ich Entitäten, Services und JUnit-Tests für Services mit Spring-Daten erstellt habe. All das funktioniert großartig. Dann habe ich spring-mvc hinzugefügt, um diese Webanwendung mit vielen verschiedenen Schritt-für-Schritt-Anleitungen zu erstellen, aber wenn ich versuche, Controller mit @Autowired-Annotation zu machen. Und ich habe eine Ausnahme von der Eclipse und ich habe versucht, es zu lösen, aber ich kann immer noch nicht mit diesem Problem umgehen.org.springframework.beans.factory.BeanCreationException: Fehler beim Erstellen einer Bean mit dem Namen 'personController'

PersonRepsoitory

package com.wei.springdata; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.data.repository.CrudRepository; 
import org.springframework.data.repository.PagingAndSortingRepository; 

//@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class) 
public interface PersonRepsoitory extends JpaRepository<Person,Integer> { 
} 

PersonService_interface

package com.wei.springdata; 

import java.util.List; 

public interface PersonService_interface { 
    public void savePersons(List<Person> persons); 
    public List<Person> getAllPerson(); 
} 

PersonService

package com.wei.springdata; 

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 


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

@Service 
public class PersonService implements PersonService_interface{ 

@Autowired 
private PersonRepsoitory personRepsoitory; 

@Override 
public void savePersons(List<Person> persons){ 
    personRepsoitory.save(persons); 
} 
@Override 
public List<Person> getAllPerson() { 
    List<Person> person=new ArrayList<Person>(); 
    Iterable<Person> personIterable=personRepsoitory.findAll(); 
    Iterator<Person> perosnIterator=personIterable.iterator(); 
    while(perosnIterator.hasNext()) 
    { 
     person.add(perosnIterator.next()); 
    } 
    return person; 
    } 


} 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/data/jpa 
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd 
    http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 
    http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 

<!-- 配置自動掃描的包 --> 
<context:component-scan base-package="com.wei.springdata"> 
</context:component-scan> 

<!-- 1. 配置數據源 --> 
<context:property-placeholder location="classpath:db.properties"/> 

<bean id="dataSource" 
    class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="user" value="${jdbc.user}"></property> 
    <property name="password" value="${jdbc.password}"></property> 
    <property name="driverClass" value="${jdbc.driverClass}"></property> 
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> 

    <!-- 配置其他属性 --> 
</bean> 

<!-- 2. 配置 JPA 的 EntityManagerFactory --> 
<bean id="entityManagerFactory" 

class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="jpaVendorAdapter"> 
     <bean 
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean> 
    </property> 
    <property name="packagesToScan" value="com.wei.springdata"></property> 
    <property name="jpaProperties"> 
     <props> 
      <!-- 二级緩存相關 --> 
      <!-- 
      <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> 
      <prop key="net.sf.ehcache.configurationResourceName">ehcache-hibernate.xml</prop> 
      --> 
      <!-- 生成的數據表的列的映射策略 --> 
      <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> 
      <!-- hibernate 基本属性 --> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
</bean> 

<!-- 3. 配置事務管理器 --> 
<bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"></property>  
</bean> 

<!-- 4. 配置支持注解的事务 --> 
<tx:annotation-driven transaction-manager="transactionManager"/> 

<!-- 5. 配置 SpringData --> 
<!-- 加入 jpa 的命名空间 --> 
<!-- base-package: 掃描 Repository Bean 所在的 package --> 
<jpa:repositories base-package="com.wei.springdata" 
    entity-manager-factory-ref="entityManagerFactory"></jpa:repositories> 

feder servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 

<!-- 通知 spring-webmvc 掃描「某自訂套件」內,是否有被相關Annotation設定為元件的類別 --> 
<context:component-scan base-package="com.wei.springdata.controller." /> 
<!-- 必須使用以下標籤啟用「自訂控制器」內 @Controller 的Annotation支援 --> 
<mvc:annotation-driven /> 

<!-- Internal Resource View (內部資源視圖): --> 
<!-- 在Spring MVC中,對於好的做法,它總是建議把整個Views或JSP文件放在"WEB-INF"目錄底下, 以保護其免受透過手動輸入網址而直接存取(direct access)。 --> 
<!-- 放在"WEB-INF"目錄底下的這些Views或JSP文件,被命名為Internal Resource View (內部資源視圖), 因為它只能由透過servlet或Spring控制器類別來存取。 --> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/views/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

<!-- 靜態資源目錄resources,存放如 CSS/JavaScript...等 --> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 

<!-- Spring3.1開始支援-方法級別驗證 (JSR-349 Bean Validation 1.1) --> 
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 

Exception

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.wei.springdata.PersonService com.wei.springdata.controller.PersonController.personService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.wei.springdata.PersonService] 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:292) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:643) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:606) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:657) 
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:525) 
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:466) 
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:1269) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1182) 
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1072) 
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5368) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5660) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.wei.springdata.PersonService com.wei.springdata.controller.PersonController.personService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.wei.springdata.PersonService] 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:292) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:643) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:606) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:657) 
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:525) 
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:466) 
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:1269) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1182) 
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1072) 
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5368) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5660) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561) 
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: com.wei.springdata.PersonService com.wei.springdata.controller.PersonController.personService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.wei.springdata.PersonService] 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:508) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
... 29 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.wei.springdata.PersonService] 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:1100) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
... 31 more 
+0

Sie müssen die Schnittstelle automatisch ansteuern, nicht die konkrete Klasse. Bitte respektieren Sie die Java-Namenskonventionen und beheben Sie die Sperrung von PersonRepsotory. –

+0

OK, ich habe bereits behoben und habe Ihren Rat verwendet – Wei

Antwort

0

In You spring-servlet.xml sieht das Tag falsch aus: Der Paketname endet mit einem Punkt. Versuchen Sie <context:component-scan base-package="com.wei.springdata,com.wei.springdata.controller" />

stattdessen!

+0

danke, aber das Problem, kann nicht gelöst werden ... – Wei

Verwandte Themen