2016-10-02 92 views
0

我使用Spring + Hibernate + JPA和Tomcat 7進行REST服務。當我啓動應用程序,我得到如下:沒有定義[javax.persistence.EntityManagerFactory]類型的限定bean

org.apache.catalina.core.ApplicationContext log org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mainController': Unsatisfied dependency expressed through field 'carService': Error creating bean with name 'carServiceImpl': Unsatisfied dependency expressed through field 'carDao': Error creating bean with name 'carDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'carDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'carServiceImpl': Unsatisfied dependency expressed through field 'carDao': Error creating bean with name 'carDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'carDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined 
    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'carServiceImpl': Unsatisfied dependency expressed through field 'carDao': Error creating bean with name 'carDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'carDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined 
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'carDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined 

下面我展示我的春天配置類

@Configuration 
@Import(DispatcherServletConfig.class) 
@ComponentScan(basePackages = "org.parkingTracker.controller, org.parkingTracker.service, org.parkingTracker.dao") 
@ImportResource("classpath*:/dao/src/main/resources/spring/dao-context.xml") 
public class RootConfig { 
    public RootConfig() {} 
} 

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "org.parkingTracker.controller, org.parkingTracker.service") 
public class DispatcherServletConfig { 
    public DispatcherServletConfig() {} 
} 

我也有服務和DAO類訪問數據。要注入EntityManager在我的道,我使用的是@PersistenceContext註釋,注射道服務類我使用簡單的彈簧註釋。下面你可以看到我的spring xml配置爲DAO佈局。 一個重要的意見,當我的DAO類所有通過正確運行的測試,和我沒有任何異常,我獲得有效數據

<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-4.3.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.3.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd "> 
<context:component-scan base-package="org.parkingTracker.dao"/> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="emf"/> 
</bean> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.postgresql.Driver"/> 
    <property name="url" value="jdbc:postgresql://localhost:5432/parking"/> 
    <property name="username" value="postgres"/> 
    <property name="password" value="a1f10g"/> 
    <property name="initialSize" value="20"/> 
    <property name="maxActive" value="100"/> 
</bean> 
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false"/> 
     </bean> 
    </property> 
    <property name="packagesToScan" value="org.parkingTracker.model"/> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQL94Dialect</prop> 
     </props> 
    </property> 
</bean> 
<tx:annotation-driven transaction-manager="transactionManager"/> 
<jpa:repositories base-package="org.parkingTracker" 
        entity-manager-factory-ref="emf" 
        transaction-manager-ref="transactionManager"/></beans> 

CarServiceImpl:

public class CarServiceImpl implements CarService { 
@Autowired 
private CarDao carDao; 
@Override 
public void saveCar(Car car) throws EntityAlreadyExistException { 
    carDao.saveCar(car); 
} 
@Override 
public Car getCarById(int id) { 
    return carDao.getCarById(id); 
} 
@Override 
public Car getCarByIdWithTimeSpend(int id) { 
    return carDao.getCarByIdWithTimeSpend(id); 
} 
@Override 
public Car getCarByNumber(String number) { 
    return carDao.getCarByNumber(number); 
} 
@Override 
public Car getCarByNumberWithTimeSpend(String number) { 
    return carDao.getCarByNumberWithTimeSpend(number); 
} 

CarDao:

@Transactional 
@Repository("carDao") 
public class CarDaoImp implements CarDao{ 
    private final String EXIST_SQL = "SELECT 1 FROM car WHERE car_num = :num"; 
    @PersistenceContext 
    private EntityManager entityManager; 
    @Transactional() 
    public void saveCar(Car car) throws EntityAlreadyExistException { 
     if(entityManager.createNativeQuery(EXIST_SQL).setParameter("num", car.getNumber()).getSingleResult()!=null){ 
      throw new EntityAlreadyExistException(); 
     }else { 
      entityManager.persist(car); 
     } 
    } 
    @Transactional(readOnly = true) 
    public Car getCarById(int id) { 
     return entityManager.find(Car.class, id); 
    } 
    @Transactional(readOnly = true) 
    public Car getCarByIdWithTimeSpend(int id) { 
     Car car = entityManager.find(Car.class, id); 
     Hibernate.initialize(car.getTimeSet()); 
     return car; 
    } 
    @Override 
    @Transactional(readOnly = true) 
    public Car getCarByNumber(String number) throws NoResultException{ 
     CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<Car> carCriteriaQuery = entityManager.getCriteriaBuilder().createQuery(Car.class); 
     Root<Car> root = carCriteriaQuery.from(Car.class); 
     carCriteriaQuery.select(root); 
     carCriteriaQuery.where(builder.equal(root.get(Car_.number), number)); 
     return entityManager.createQuery(carCriteriaQuery).getSingleResult(); 
    } 
    @Override 
    @Transactional(readOnly = true) 
    public Car getCarByNumberWithTimeSpend(String number){ 
     CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<Car> carCriteriaQuery = entityManager.getCriteriaBuilder().createQuery(Car.class); 
     Root<Car> root = carCriteriaQuery.from(Car.class); 
     carCriteriaQuery.select(root); 
     carCriteriaQuery.where(builder.equal(root.get(Car_.number), number)); 
     Car car = entityManager.createQuery(carCriteriaQuery).getSingleResult(); 
     Hibernate.initialize(car.getTimeSet()); 
     return car; 
    } 
} 

的web.xml:

<web-app 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     version="3.0">  
    <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> 
      org.parkingTracker.controller.config.RootConfig 
     </param-value> 
    </context-param>  
    <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <init-param> 
      <param-name>contextClass</param-name> 
      <param-value>    org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
      </param-value> 
     </init-param> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
       org.parkingTracker.controller.config.DispatcherServletConfig 
      </param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 
+1

我非常懷疑你有一個包裹'dao.src.main.resources.spring'存儲你的XML文件。它可能應該是'classpath *:spring/dao-context.xml'。但是,爲什麼你使用XML而不是Java代碼來定義你的配置? –

+0

我也試圖把我的dao-context.xml放到根文件夾中,並且我有同樣的錯誤,如果spring不能找到配置,他會拋出另一個例外,比如FileNotFound – Jungle

+0

你可以添加carServiceImpl – kuhajeyan

回答

1

看來國際奧委會集裝箱未能注入EntityManagerFactory
CarDaoImp。我查看了你的代碼,看起來你定義了所有必要的配置,我認爲問題在於你的XML配置文件加載。

嘗試使用classpath:your_xml_config.xml,不帶文件夾結構前綴。像這樣:

@Configuration 
@Import(DispatcherServletConfig.class) 
@ComponentScan(basePackages = "org.parkingTracker.controller, org.parkingTracker.service, org.parkingTracker.dao") 
@ImportResource("classpath:dao-context.xml") 
public class RootConfig { 
    public RootConfig() {} 
} 
+0

我將dao-context.xml添加到根文件夾,當@ImportResource(「classpath:dao-context.xml」)和我寫入時,我有FIleNotFoundException '@ImportResource(「classpath *:/ dao-context.xml」)'我有同樣的錯誤 – Jungle

+0

'dao-context.xml'應該放在'/ resources'文件夾下,你的項目文件結構是什麼? –

+0

謝謝你,我只是把我的上下文放在資源文件夾中 – Jungle

相關問題