Reputation: 9823
I am receiving the following error when trying to start up my Spring Boot application:
Note: This error only occurs when I put the @Autowired
annotation over the IDeviceRepository iDeviceRepository;
in the DeviceDao.java
class
I have yet to get the DeviceDao.java
to persist to the database - but the entities are being created
> ***************************
> APPLICATION FAILED TO START
> ***************************
>
> Description:
> Field iDeviceRepository in com.abc.dao.DeviceDao required a bean named 'entityManagerFactory' that could not be found.
> Action:
> Consider defining a bean named 'entityManagerFactory' in your configuration.
This is directory structure of the project:
├───src
│ ├───main
│ │ ├───java
│ │ │ └───com
│ │ │ └───abc
│ │ │ ├───controller
│ │ │ ├───dao
│ │ │ │ └───repositories
│ │ │ ├───init
│ │ │ ├───model
│ │ │ ├───service
│ │ │ └───util
│ │ │ ├───common
│ │ │ ├───enums
│ │ │ ├───exceptions
│ │ │ └───interfaces
│ │ └───resources
│ │ ├───static
│ │ │ ├───css
│ │ │ ├───fonts
│ │ │ ├───img
│ │ │ └───js
│ │ └───templates
com.abc.init.Application.java
package com.abc.init;
@SpringBootApplication
@EnableJpaRepositories("com.abc.dao.repositories")
@EntityScan(basePackages = { "com.abc.model" })
@ComponentScan(basePackages={ "com.abc.controller", "com.abc.service", "com.abc.dao" })
public class Application
{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
com.abc.controller.RegisterController.java
package com.abc.controller;
@Controller
public class RegisterController
{
@Autowired
RegisterServiceImpl registerService;
@GetMapping("/register")
public String registerForm(Model model) {
model.addAttribute("device", new Device());
return "registerDevice";
}
@PostMapping("/register")
public String registerSubmit(@ModelAttribute Device device) {
registerService.registerDevice(device)
return "registerDeviceSuccess";
}
}
com.abc.service.RegisterServiceImpl.java
package com.abc.service;
@Service
public class RegisterServiceImpl implements IRegisterService
{
@Autowired
DeviceDao devDao;
public boolean registerDevice (Device device) {
devDao.saveDevice(device);
return true;
}
}
com.abc.util.interfaces.IRegisterService
package com.abc.util.interfaces;
public interface IRegisterService
{
public boolean registerDevice(Device device);
}
com.abc.dao.DeviceDao.java
package com.abc.dao;
@Repository
public class DeviceDao
{
@Autowired
IDeviceRepository iDeviceRepository;
public Device saveDevice(Device device) {
return iDeviceRepository.save(device);
}
}
com.abc.dao.repositories.IDeviceRepository.java
package com.abc.dao.repositories;
@Repository
public interface IDeviceRepository extends CrudRepository<Device, Long> {}
application.properties
# Exposed HTTP Port
server.port = 8090
# Database Configuration Parameters
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=mydbadmin
spring.datasource.password=mydbpassword
spring.datasource.driver-class-name=org.postgresql.Driver
# Hibernate Configurations
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
# Display SQL Commands in Terminal
spring.jpa.show-sql=true
Stack Trace:
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'registerController': Unsatisfied dependency expressed through field 'registerService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'registerServiceImpl': Unsatisfied dependency expressed through field 'devDao'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'deviceDao': Unsatisfied dependency expressed through field 'iDeviceRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IDeviceRepository': Cannot create inner bean '(inner bean)#36dce7ed' 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)#36dce7ed': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'registerServiceImpl': Unsatisfied dependency expressed through field 'devDao'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'deviceDao': Unsatisfied dependency expressed through field 'iDeviceRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IDeviceRepository': Cannot create inner bean '(inner bean)#36dce7ed' 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)#36dce7ed': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'deviceDao': Unsatisfied dependency expressed through field 'iDeviceRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IDeviceRepository': Cannot create inner bean '(inner bean)#36dce7ed' 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)#36dce7ed': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IDeviceRepository': Cannot create inner bean '(inner bean)#36dce7ed' 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)#36dce7ed': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#36dce7ed': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
Can anyone please advise?
Upvotes: 2
Views: 22700
Reputation: 689
I faced similar issue when I started learning Spring-Boot some months back. I am not sure whether Spring takes directory structure seriously. I had similar directory structure as @Pawan. All you have to do is move your repository folder one level up i.e. move it into parent abc folder. Annotate your DeviceDao class with @Service. Finally update the repository path in @EnableJpaRepository. This worked for me. Hope this help.
Upvotes: 0
Reputation: 537
In spring-boot, you don't need to annotate your repository class with the repository annotation.
@Repository
You just need to extend JPARepository on your interface and Spring-boot will take care of the rest. For Example:
public interface YourRepository extends JpaRepository<YourDomain, Serializable> {
YourDomain findBysomeparameter(Long parameter);
}
And you don't need to add these annotations:
@EnableJpaRepositories
@EntityScan
@ComponentScan
Spring-boot does that automatically unless you're doing some configuration.
I hope this will help.
Upvotes: 4