I have a web application that uses spring and hibernate for JPA support, but when I open my Index page this exception happens:
But I think my applicationContext.xml is well configured, but I’m posting it anyways just to be sure:
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
<!-- properties file for jdbc database access details / -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- enabling annotation driven configuration / -->
<context:annotation-config />
<context:component-scan base-package="com.maegul" />
<tx:annotation-driven transaction-manager="transactionManager" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
p:username="${jdbc.username}" p:password="${jdbc.password}" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
<property name="persistenceUnitName" value="maegul"></property>
</bean>
<bean id="jpaAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:database="${jpa.database}" p:showSql="${jpa.showSql}" />
</beans>
I really don’t know what’s wrong, I’ve been changing little things to no avail, any help would be greatly appreciated.
EDIT (Long Stack in pastebin for easier reading…)
Changed some things in the ApplicationContext.xml and now I get a different stack trace:
INFO - Server - jetty-7.5.0.v20110901
INFO - tandardDescriptorProcessor - NO JSP Support for {}, did not find {}
INFO - / - Initializing Spring root WebApplicationContext
INFO - ContextLoader - Root WebApplicationContext: initialization started
INFO - XmlWebApplicationContext - Refreshing Root WebApplicationContext: startup date [Sun Nov 06 13:22:53 COT 2011]; root of context hierarchy
INFO - XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/ApplicationContext.xml]
INFO - DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@40871449: defining beans [maegulApplication,itemService,userService,cartItemDao,mediaItemDao,mediaSourceDao,passwordDao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor]; root of factory hierarchy
INFO - DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@40871449: defining beans [maegulApplication,itemService,userService,cartItemDao,mediaItemDao,mediaSourceDao,passwordDao,userDao,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor]; root of factory hierarchy
ERROR - ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.maegul.data.dao.impl.MediaItemDao com.maegul.service.implementation.ItemFindService.mediaItemDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mediaItemDao': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0
Rest of stack here: http://pastebin.com/u82n3C5n
I see that the Annotations I made are getting recognized, but it looks like it can’t still find an entityManagerFactory. One thing I’ve seen is that maybe instead of using @PersistenceContext should I use @PersistenceUnit in my EntityManager fields, but I dont know…
EDIT 2
All my DAO implementations look like this:
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import com.maegul.data.dao.AbstractDAO;
import com.maegul.data.entities.MediaItem;
@Repository(value = "mediaItemDao")
public class MediaItemDaoImpl extends AbstractDAO<MediaItem> implements
MediaItemDao {
@PersistenceContext
private EntityManager em;
/*
* (non-Javadoc)
*
* @see com.maegul.data.dao.DAO#getEntityManager()
*/
public EntityManager getEntityManager() {
return em;
}
/*
* (non-Javadoc)
*
* @see com.maegul.data.dao.DAO#getClazz()
*/
public Class<MediaItem> getClazz() {
return MediaItem.class;
}
/*
* (non-Javadoc)
*
* @see com.maegul.data.dao.impl.MediaItemDao#findByName(java.lang.String)
*/
public MediaItem findByName(String name) {
Query q = getEntityManager().createQuery(
"select u from " + getClazz() + " where u.name = :name");
q.setParameter("name", name);
return (MediaItem) q.getSingleResult();
}
/*
* (non-Javadoc)
*
* @see com.maegul.data.dao.impl.MediaItemDao#findByType(java.lang.String)
*/
@SuppressWarnings("unchecked")
public List<MediaItem> findByType(String type) {
Query q = getEntityManager().createQuery("select u from " + getClazz() + " where u.type = :type");
q.setParameter("type", type);
return q.getResultList();
}
}
EDIT 3
This is the AbstractDAO class: http://pastebin.com/f2BQG9RE
And this is the DAO interface, which is implemented by AbstractDAO: http://pastebin.com/h7dAHTTC
and this is the Interface MEdiaItemDao:
import java.util.List;
import com.maegul.data.dao.DAO;
import com.maegul.data.entities.MediaItem;
public interface MediaItemDao extends DAO<MediaItem>{
MediaItem findByName(String name);
List<MediaItem> findByType(String type);
}
It only needed a project clean, so I did and it fixed it.