Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot create inner bean '(inner bean)' of type [org.springframework.orm.jpa.SharedEntityManagerCreator]?

I have used the Java based configurations. When I use the jpa repositories I get the can not create inner bean exception of type shared entity manger creator.

Spring contex config:

@Configuration
@ComponentScan(basePackages = { "com.sample.proj.controller" })
@EnableWebMvc
@EnableTransactionManagement
@EnableJpaRepositories("com.sample.proj.domain")
@PropertySource("classpath:application.properties")
public class ServletContextConfig {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    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_DATABASE_PASSWORD = "db.password";
    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_HIBERNATE_HBN2DDL_SQL = "hibernate.hbm2ddl.auto";

    @Resource
    private Environment environment;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(environment
                .getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(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 LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
            throws Exception {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean
                .setPackagesToScan(new String[] { "com.sample.proj.domain" });
        entityManagerFactoryBean
                .setPersistenceProviderClass(HibernatePersistence.class);

        Properties jproperties = new Properties();
        jproperties.put("hibernate.dialect", environment
                .getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        jproperties.put("hibernate.format_sql", environment
                .getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
        jproperties.put("hibernate.ejb.naming_strategy", environment
                .getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
        jproperties.put("hibernate.show_sql", environment
                .getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        jproperties.put("hibernate.hbm2ddl.auto", environment
                .getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBN2DDL_SQL));
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        entityManagerFactoryBean.setJpaProperties(jproperties);
        return entityManagerFactoryBean;
    }

}

Webintializer:

@Override
public void onStartup(ServletContext container) {
        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(ServletContextConfig.class);

        // Manage the lifecycle of the root application context
        container.addListener(new ContextLoaderListener(rootContext));

        // Create the dispatcher servlet's Spring application context
        AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
        dispatcherContext.register(ServletContextConfig.class);

        // Register and map the dispatcher servlet
        ServletRegistration.Dynamic dispatcher = container.addServlet(
                "dispatcher", new DispatcherServlet(dispatcherContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
}

Repository:

    public interface PersonRepository extends JpaRepository<Person, String> {

    }

Service class:

    @Service
    @Transactional
    public class PersonService {

        @Autowired
        PersonRepository personRepository;

        public Person saveDetails(Person person) {
            // System.out.println("Service Class:Person Name:"+
            // person.getPersonName());
            System.out.println("Executed");
            return person;
        }

    }

Controller class:

    @RequestMapping(value = "/addPerson", method = RequestMethod.POST)
        public String addperson(@RequestParam("personName") String name,
                @RequestParam("personAddress") String address, Model model) {
            System.out.println("Name:" + name);
            System.out.println("Address:" + address);
            Person person = new Person();
            person.setPersonId(1);
            person.setPersonName(name);
            person.setPersonAddress(address);
            personService.saveDetails(person);
            model.addAttribute("result", "Your record inserted successfully");

            return HOME_VIEW;
        }

Domain class:

@Entity
@Table(name = "PERSON")
public class Person implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    private Integer personId;
    private String personName;
    private String personAddress;

    //getters and setters... 

}

The exception stacktrace is as below:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
        org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personRepository': 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:282)
            at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:126)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1391)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1132)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
            at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
            at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
            at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:589)
            at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
            at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383)
            at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
            at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
            at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791)
            at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
            at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
            at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618)
            at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:650)
            at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1582)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
            at java.util.concurrent.FutureTask.run(FutureTask.java:262)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
            at java.lang.Thread.run(Thread.java:744)
like image 701
Balu Avatar asked Oct 29 '13 08:10

Balu


2 Answers

First of all if you look closely at your exception trace you'll see that ContextLoaderListner is actually complaining about No bean named 'entityManagerFactory' is defined as the root cause for not being able to create personRepository.

As I dont know what exact project structure is, You can try putting bean name with LocalContainerEntityManagerFactoryBean so that Spring can find and inject it.

i.e. Something like this :

@Bean(name = "entityManagerFactoryBean")
public LocalContainerEntityManagerFactoryBean ...
like image 189
Anuj Patel Avatar answered Sep 20 '22 13:09

Anuj Patel


Using the

@EnableJpaRepositories("some.package.ref.other.than.default")

in main Application.java file did the trick for me.

I have most of my files located in package

com.example.cortifero

Therefore, I have written my code as such (Application.java):

@EnableJpaRepositories(basePackages="com.example.cortifero.jpa.service") //notice this line
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
like image 40
malvadao Avatar answered Sep 18 '22 13:09

malvadao