Announcement Announcement Module
Collapse
No announcement yet.
Spring Data JPA Issue --> No bean named 'entityManagerFactory' is defined Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Spring Data JPA Issue --> No bean named 'entityManagerFactory' is defined

    Dear all,

    Description:
    I use Jersey for a REST full webapplication in combination with Spring and Spring Data JPA. Currently Jersey is configured as servlet with the "jersey-spring" extension. Now I can call a URL and get the implemented response message.

    Issue:
    When I configure the entity manager I get allways the message "No bean named 'entityManagerFactory' is defined", after starting the servlet with tomcat:
    Code:
    ...
    4303 [localhost-startStop-1] INFO org.springframework.web.context.support.AnnotationConfigWebApplicationContext - Bean 'entityManagerFactoryBean' of type [class org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
    4324 [localhost-startStop-1] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@69da79bb: defining beans [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,applicationContext,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0,service,org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,userRepository,org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#1,dataSource,transactionManager,entityManagerFactoryBean]; root of factory hierarchy
    4383 [localhost-startStop-1] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@69da79bb: defining beans [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,applicationContext,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0,service,org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#0,org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,userRepository,org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#1,dataSource,transactionManager,entityManagerFactoryBean]; root of factory hierarchy
    4384 [localhost-startStop-1] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default'
    4385 [localhost-startStop-1] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Cannot create inner bean '(inner bean)' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
    	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:281)
    ...
    I use follow technologies:
    • Jersey 1.16 (using as REST servlet)
    • jersey-spring 1.2 (needed, when you use jersey with spring)
    • Spring 3.1.2
    • Spring-Data-JPA 1.2.0
    • Hibernate 4.1
    • MySql 5.1
    • Tomcat 7

    web.xml
    Code:
    ...
      <servlet>
        <servlet-name>ContactService</servlet-name>
        <!-- Servlet class file, which is needed to run the application as servlet with jersey + spring -->
        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        
        <!-- Locate the root package for the jersey service classes -->
        <init-param>
          <param-name>com.sun.jersey.config.property.packages</param-name>
          <param-value>com.fileshare.main.example</param-value>
        </init-param>
        
        <load-on-startup>1</load-on-startup>
      </servlet>
     
      <listener>
    	<listener-class>
    		org.springframework.web.context.ContextLoaderListener
    	</listener-class>
      </listener>
     
       <!-- Needed to use a java base configuration file without an applicationContext.xml file -->
       <context-param>
    		<param-name>contextClass</param-name>
        	<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
       </context-param>
       
       <!-- Path to the package, with the java configuration file -->
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>com.fileshare.main.configurations</param-value>
    	</context-param>   
    
       <!-- Define the URL path, which is use for the servlet -->
      <servlet-mapping>
        <servlet-name>ContactService</servlet-name>
        <url-pattern>/rest/*</url-pattern>
      </servlet-mapping>
      
    </web-app>
    ApplicationContext.java
    Code:
    // Old applicationContext, actually this file is not used. But perhaps in the future!
    @ImportResource("classpath:applicationContext.xml")
    // Enable java in code configuration (without applicationContext.xml file)
    @Configuration
    // Scan for repositories
    @EnableJpaRepositories("com.fileshare.main.repositories")
    // Scan for Spring components (Now you can autowire spring components wich use annotations like @Component, @Service, @Resource)
    @ComponentScan(basePackages = { "com.fileshare.main.example" })
    // Path to a properties file (Save database connecting data and something like that)
    @PropertySource("classpath:application.properties")
    public class ApplicationContext{
        private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
        private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
        private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
        private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
    
        private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
        private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
        private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
        private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
        private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
    
        @Resource
        private Environment environment;
        
        @Bean
        public DataSource dataSource() {
            BoneCPDataSource dataSource = new BoneCPDataSource();
    
            dataSource.setDriverClass(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
            dataSource.setJdbcUrl(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
            dataSource.setUsername(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
            dataSource.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
    
            return dataSource;
        }
        
        @Bean
        public JpaTransactionManager transactionManager() throws ClassNotFoundException {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
    
            transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
    
            return transactionManager;
        }
        
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() throws ClassNotFoundException {
            LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    
            entityManagerFactoryBean.setDataSource(dataSource());
            entityManagerFactoryBean.setPackagesToScan(environment.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
            entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
    
            Properties jpaProterties = new Properties();
            jpaProterties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
            jpaProterties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
            jpaProterties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
            jpaProterties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
    
            entityManagerFactoryBean.setJpaProperties(jpaProterties);
    
            return entityManagerFactoryBean;
        }
    }
    UserRepository.java
    Code:
    @Repository
    public interface UserRepository extends CrudRepository<User, Long>{
    
    	User findByMobileNummber(String mobileNummner);
    
    	User findById(String id);
    }
    application.properties
    Code:
    #Database Configuration
    ..
    #Hibernate Configuration
    ..
    entitymanager.packages.to.scan=com.fileshare.main.entities
    Thanks
    Alex

  • #2
    Have your read the stacktrace and compared it with your configuration?!

    Stacktrace
    Code:
     org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' is defined
    Configuration
    Code:
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() throws ClassNotFoundException {

    Comment


    • #3
      Ohh my god, you got it.

      Hindsight, it's a silly, simple issue. I read the stacktrace, but I can't see the tree because there are so many of them .

      Thanks !

      Comment

      Working...
      X