b.lopes b.lopes - 3 years ago 832
Java Question

Spring boot 2.0.0.M4 required a bean named 'entityManagerFactory' that could not be found

With the version of spring-boot 2.0.0.M4 I have this issue:


Description:

Field userRepository in
webroot.websrv.auth.service.JwtUserDetailsServiceImpl required a bean
named 'entityManagerFactory' that could not be found.


Action:

Consider defining a bean named 'entityManagerFactory' in your
configuration.

[WARNING]
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at ...
Caused by: org.springframework.context.ApplicationContextException:
Unable to start web server; nested exception is
org.springframework.boot.web.server.WebServerException: Unable to start
embedded Tomcat

Caused by:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error
creating bean with name 'jwtUserDetailsServiceImpl': Unsatisfied
dependency expressed through method 'setUserRepository' parameter 0;
nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'userRepository': Cannot create inner bean '(inner
bean)#770f146b' 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)#770f146b': Cannot resolve reference to
bean 'entityManagerFactory' while setting constructor argument; nested
exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
bean named 'entityManagerFactory' available




Spring boot application start:


package webroot.websrv;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebcliApplication {

public static void main(String[] args) {
SpringApplication.run(WebcliApplication.class, args);
}
}


The implemented Jwt service JwtUserDetailsServiceImpl:


@Service

public class JwtUserDetailsServiceImpl implements
UserDetailsService {

@Autowired
private UserRepository userRepository;

/**
* Injects UserRepository instance
* @param userRepository to inject
*/
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}




Here the UserRepository:

package webroot.websrv.auth.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import webroot.websrv.auth.entity.User;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

/**
* Finds user by email
* @param email to look for
* @return user by given email
*/
User findByEmail(String email);

/**
* Finds user by name
* @param name to look for
* @return user by given name
*/
User findByName(String name);
}


I have saw several time this issue reported here but most of the cases I have it OK for the given solutions.

Do I have to explicit define a bean to the entity manager ? It should be automatically injected no ?

I added the class for the UserRepository it extends a JpaRepository.

Thanks

Bruno

Recommended for you: Get network issues from WhatsUp Gold. Not end users.
Answer Source

I found the solution, it was necessary to implement a JpaConfiguration:

 @Configuration
@EnableJpaRepositories(basePackages = "webroot.webserv",
    entityManagerFactoryRef = "entityManagerFactory",
    transactionManagerRef = "transactionManager")
@EnableTransactionManagement
public class JpaConfiguration {

@Autowired
private Environment environment;

@Value("${datasource.sampleapp.maxPoolSize:10}")
private int maxPoolSize;

/*
 * Populate SpringBoot DataSourceProperties object directly from 
application.yml 
 * based on prefix.Thanks to .yml, Hierachical data is mapped out of 
the box with matching-name
 * properties of DataSourceProperties object].
 */
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSourceProperties dataSourceProperties(){
    return new DataSourceProperties();
}

/*
 * Configure HikariCP pooled DataSource.
 */
@Bean
public DataSource dataSource() {
    DataSourceProperties dataSourceProperties = dataSourceProperties();
        HikariDataSource dataSource = (HikariDataSource) 
org.springframework.boot.jdbc.DataSourceBuilder
                .create(dataSourceProperties.getClassLoader())

.driverClassName(dataSourceProperties.getDriverClassName())
                .url(dataSourceProperties.getUrl())
                .username(dataSourceProperties.getUsername())
                .password(dataSourceProperties.getPassword())
                .type(HikariDataSource.class)
                .build();
        dataSource.setMaximumPoolSize(maxPoolSize);
        return dataSource;
}

/*
 * Entity Manager Factory setup.
 */
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
throws NamingException {
    LocalContainerEntityManagerFactoryBean factoryBean = new 
LocalContainerEntityManagerFactoryBean();
    factoryBean.setDataSource(dataSource());
    factoryBean.setPackagesToScan(new String[] { "webroot.websrv" });
    factoryBean.setJpaVendorAdapter(jpaVendorAdapter());
    factoryBean.setJpaProperties(jpaProperties());
    return factoryBean;
}

/*
 * Provider specific adapter.
 */
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new 
HibernateJpaVendorAdapter();
    return hibernateJpaVendorAdapter;
}

/*
 * Here you can specify any provider specific properties.
 */
private Properties jpaProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.dialect", 
  environment.getRequiredProperty
("spring.jpa.properties.hibernate.dialect")
 );
 ...
    return properties;
}

@Bean
@Autowired
public PlatformTransactionManager 
transactionManager(EntityManagerFactory emf) {
    JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(emf);
    return txManager;
}
}

Thanks for the suggestions.
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download