Spring Boot: рассмотрите возможность определения бина с именем entityManagerFactory в вашей конфигурации - PullRequest
0 голосов
/ 11 октября 2018

При попытке запустить приложение Spring Boot появляется следующая ошибка:

Примечание. Эта ошибка возникает только тогда, когда я помещаю аннотацию @Autowired над IDeviceRepository iDeviceRepository; в классе DeviceDao.java

Мне еще предстоит получить DeviceDao.java для сохранения в базе данных - но сущности создаются

> *************************** 
> 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.

Это структура каталогов проекта:

├───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

Трассировка стека:

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

Кто-нибудь может посоветовать, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я столкнулся с подобной проблемой, когда начал изучать Spring-Boot несколько месяцев назад.Я не уверен, что Spring серьезно относится к структуре каталогов.У меня была похожая структура каталогов, как у @Pawan.Все, что вам нужно сделать, это переместить вашу папку хранилища на один уровень вверх, т.е. переместить ее в родительскую папку abc .Аннотируйте свой класс DeviceDao с помощью @Service.Наконец обновите путь к репозиторию в @ EnableJpaRepository .Это сработало для меня.Надеюсь, что это поможет.

0 голосов
/ 11 октября 2018

В Spring-Boot вам не нужно аннотировать свой класс репозитория с помощью аннотации репозитория.

@Repository

Вам просто нужно расширить JPARepository на вашем интерфейсе, а Spring-boot позаботится обо всем остальном.Например:

public interface YourRepository extends JpaRepository<YourDomain, Serializable> {

    YourDomain findBysomeparameter(Long parameter);

}

И вам не нужно добавлять эти аннотации:

@EnableJpaRepositories
@EntityScan
@ComponentScan

Spring-boot делает это автоматически, если вы не выполняете какую-либо настройку.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...