我使用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>
我非常懷疑你有一個包裹'dao.src.main.resources.spring'存儲你的XML文件。它可能應該是'classpath *:spring/dao-context.xml'。但是,爲什麼你使用XML而不是Java代碼來定義你的配置? –
我也試圖把我的dao-context.xml放到根文件夾中,並且我有同樣的錯誤,如果spring不能找到配置,他會拋出另一個例外,比如FileNotFound – Jungle
你可以添加carServiceImpl – kuhajeyan