代码之家  ›  专栏  ›  技术社区  ›  AlanK

springboot:考虑在配置中定义一个名为“entityManagerFactory”的bean

  •  1
  • AlanK  · 技术社区  · 8 年前

    我在尝试启动Spring Boot应用程序时收到以下错误:

    注意:只有当我将 @Autowired 注释覆盖 IDeviceRepository iDeviceRepository; DeviceDao.java 班

    我还没有拿到 设备DAO.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);
        }
    }
    

    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";
        }
    }
    

    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);
        }
    }
    

    package com.abc.dao.repositories;
    
    @Repository
    public interface IDeviceRepository extends CrudRepository<Device, Long> {}
    

    应用程序属性

    # 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 回复  |  直到 8 年前
        1
  •  2
  •   Pawan Tiwari    8 年前

    在springboot中,不需要用repository注释来注释repository类。

    @Repository
    

    您只需要在接口上扩展JPARepository,剩下的就由Spring boot来处理了。 例如:

    public interface YourRepository extends JpaRepository<YourDomain, Serializable> {
    
        YourDomain findBysomeparameter(Long parameter);
    
    }
    

    @EnableJpaRepositories
    @EntityScan
    @ComponentScan
    

    SpringBoot会自动执行此操作,除非您正在进行一些配置。

    我希望这会有帮助。

        2
  •  0
  •   Aman Verma    8 年前

    几个月前,当我开始学习SpringBoot时,我也遇到了类似的问题。我不确定Spring是否认真对待目录结构。我的目录结构与@Pawan类似。您所要做的就是将存储库文件夹向上移动一级,即将其移动到父文件夹中 文件夹。用@Service注释DeviceDao类。最后更新中的存储库路径 . 这对我有用。希望这有帮助。