source

스프링 부트: 'entityManagerFactory'라는 이름의 빈을 찾을 수 없습니다.

myloves 2023. 4. 3. 21:54

스프링 부트: 'entityManagerFactory'라는 이름의 빈을 찾을 수 없습니다.

JPA를 사용하여 Spring Boot 어플리케이션을 개발 중인데 이 오류가 발생하였습니다.올바른 주석을 사용하고 있는지 또는 종속성이 누락되어 있는지 확신할 수 없습니다.어떤 도움이라도 주시면 감사하겠습니다.

이것은 에러 메시지입니다.

1:05:28 AM: Executing external task 'bootRun'...
:compileJava
:processResources UP-TO-DATE
:classes
:findMainClass
:bootRun
01:05:35.198 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : []
01:05:35.201 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Excluded patterns for restart : [/spring-boot-starter/target/classes/, /spring-boot-autoconfigure/target/classes/, /spring-boot-starter-[\w-]+/, /spring-boot/target/classes/, /spring-boot-actuator/target/classes/, /spring-boot-devtools/target/classes/]
01:05:35.201 [main] DEBUG org.springframework.boot.devtools.restart.ChangeableUrls - Matching URLs for reloading : [file:/C:/Users/zahid/IdeaProjects/giflib/build/classes/main/, file:/C:/Users/zahid/IdeaProjects/giflib/build/resources/main/]

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.3.RELEASE)

2018-01-24 01:05:35.539  INFO 14840 --- [  restartedMain] com.sweng.giflib.Application             : Starting Application on DESKTOP-EKFI3C8 with PID 14840 (C:\Users\zahid\IdeaProjects\giflib\build\classes\main started by zahid in C:\Users\zahid\IdeaProjects\giflib)
2018-01-24 01:05:35.540  INFO 14840 --- [  restartedMain] com.sweng.giflib.Application             : No active profile set, falling back to default profiles: default
2018-01-24 01:05:35.828  INFO 14840 --- [  restartedMain] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@396ad740: startup date [Wed Jan 24 01:05:35 CST 2018]; root of context hierarchy
2018-01-24 01:05:37.685  INFO 14840 --- [  restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-01-24 01:05:37.697  INFO 14840 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service Tomcat
2018-01-24 01:05:37.699  INFO 14840 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.14
2018-01-24 01:05:37.800  INFO 14840 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-01-24 01:05:37.801  INFO 14840 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1976 ms
2018-01-24 01:05:37.991  INFO 14840 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-01-24 01:05:37.992  INFO 14840 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-01-24 01:05:37.992  INFO 14840 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-01-24 01:05:37.992  INFO 14840 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-01-24 01:05:37.993  INFO 14840 --- [ost-startStop-1] .s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*]
2018-01-24 01:05:37.994  INFO 14840 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2018-01-24 01:05:38.291  WARN 14840 --- [  restartedMain] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfig': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userServiceImpl': Unsatisfied dependency expressed through field 'userRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Cannot create inner bean '(inner bean)#64397422' 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)#64397422': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
2018-01-24 01:05:38.294  INFO 14840 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service Tomcat
2018-01-24 01:05:38.321  INFO 14840 --- [  restartedMain] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-01-24 01:05:38.444 ERROR 14840 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field userRepository in com.sweng.giflib.service.UserServiceImpl required a bean named 'entityManagerFactory' that could not be found.


Action:

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


BUILD SUCCESSFUL

Total time: 9.681 secs
1:05:38 AM: External task execution finished 'bootRun'.

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.3.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}


group 'com.sweng'
version '1.0-SNAPSHOT'


apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'

repositories {
    mavenCentral()
}

springBoot {
    mainClass = "com.sweng.giflib.Application"
}
dependencies {
    compile "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion"
    compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
    compile "org.springframework.boot:spring-boot-starter-thymeleaf:$springBootVersion"
    compile "org.springframework.boot:spring-boot-devtools:$springBootVersion"
    compile "mysql:mysql-connector-java"
    compile "org.springframework.boot:spring-boot-starter-security:$springBootVersion"
    compile "org.thymeleaf.extras:thymeleaf-extras-springsecurity4:2.1.2.RELEASE"

    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

application.properties

spring.datasource.url== jdbc:mysql://localhost:3306/giflib
spring.db.driver= com.mysql.jdbc.Driver
spring.datasource.username = su
spring.datasource.password = 
spring.jpa.show-sql = true
#spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy

어플.자바

package com.sweng.giflib;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@ComponentScan
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableJpaRepositories(basePackages = "com.sweng.giflib.repository")
@SpringBootApplication(scanBasePackages= "com.sweng.giflib")

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

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

}

사용자 서비스자바

package com.sweng.giflib.service;

import com.sweng.giflib.model.User;
import org.springframework.security.core.userdetails.UserDetailsService;

public interface UserService extends UserDetailsService {
    User findByUsername(String username);
}

UserServiceImpl.java

package com.sweng.giflib.service;

import com.sweng.giflib.repository.UserRepository;
import com.sweng.giflib.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public User findByUsername(String username)
    {
        return userRepository.findByusername(username);
    }


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // Load user from the database (throw exception if not found)
        User user = userRepository.findByusername(username);
        if(user == null) {
            throw new UsernameNotFoundException("User not found");
        }

        // Return user object
        return user;
    }

}

UserRepository.java

package com.sweng.giflib.repository;


import com.sweng.giflib.model.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CrudRepository<User, Long>{
    User findByusername(String name);

}

User.java

package com.sweng.giflib.model;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.*;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Entity
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(unique = true)
    @Size(min = 8, max = 20)
    private String username;

    @Column(length = 100)
    private String password;

    @Column(nullable = false)
    private boolean enabled;

    @OneToOne
    @JoinColumn(name = "role_id")
    private Role role;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(role.getName()));
        return authorities;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return enabled;
    }
}

다음과 같은 오류 메시지가...

에는 'entityManagerFactory'라는 이름의 빈을 찾을 수 없습니다.

이 문제는 구글 검색을 많이 한 후에 해결된다.JPA 수동 설정을 합니다.

@Bean 
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 

    return sessionFactory;
}

그러나 기본적으로는 검색 세션팩토리 이름은 'entityManagerFactory'이므로 코드를 다음과 같이 변경합니다.

@Bean(name="entityManagerFactory")
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

    return sessionFactory;
} 

난, 난 그걸 지우는 걸 잊었어DataSourceAutoConfiguration.class제외됩니다.

그래서 다음과 같이 됩니다.

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
// Main class definition

다음 항목이어야 합니다.

@SpringBootApplication()
// Main class definition

스프링 부트를 mysql 데이터베이스에 연결하려고 할 때 동일한 문제가 발생합니다.

나를 살린 것은 올바른 버전의 hibernate-core를 pom 파일에 추가한 것이다.휴지 상태 이후 5.2.0부터는 휴지 상태-엔티티 매니저가 필요하지 않습니다.프로세스 수집 중 Spring Data JPA에 hibernate-core 5.2.0 문제가 발생.Hibernate-core 5.2.1Spring Data JPA를 사용하는 경우 Spring Data JPA에서 위와 같은 작업을 수행할 수 있습니다.

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-core</artifactId>
 <version> 5.2.1.Final</version>
</dependency>

이 경우는 정상적으로 동작하고 있었지만, @WebMvcTest를 사용한 테스트에서는 동작하지 않았습니다.

알아내는 데 시간이 걸렸지만 문제는 다음과 같습니다.

@SpringBootApplication
@ComponentScan({"com.givenproject"})
@EntityScan("com.givenproject")
@EnableJpaRepositories("com.givenproject")
@Configuration
public class Application {

대신 다음 작업을 수행합니다.

@SpringBootApplication
@Configuration
public class Application {

그리고.

@Configuration
@ComponentScan({"com.givenproject"})
@EntityScan(basePackages = "com.givenproject")
@EnableJpaRepositories(basePackages = "com.givenproject")
public class DataConfig {
}

제거하거나 둘 중 하나, 둘 중 하나,exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}(이 경우 스프링은 자동으로 데이터 소스를 구성합니다) 또는 데이터 소스를 수동으로 구성합니다.

@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource() {
    return new YourCustomDataSource();
}

업데이트: 속성에 오류가 있는 것 같습니다.

spring.datasource.url== jdbc:mysql://localhost:3306/giflib
spring.db.driver= com.mysql.jdbc.Driver

엑스트라 제거 시도=첫줄부터 사용법spring.datasource.driver-class-name두 번째 속성 이름:

spring.datasource.url=jdbc:mysql://localhost:3306/giflib
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

MySQL 종속성에 버전도 추가합니다.

compile "mysql:mysql-connector-java:6.0.6"

이러한 실수 때문에 스프링은 데이터 소스 타입을 올바르게 자동 검출할 수 없다고 생각합니다.

주석을 삭제하는 것을 잊어버렸기 때문에 문제가 발생하고 있었습니다.@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })하드 코드화된 값을 테스트하는 동안 추가했습니다.를 사용하여 문제를 해결했습니다.@SpringBootApplication

프로젝트를 다시 빌드하고 모든 종속 요소를 다시 다운로드하십시오.저도 같은 문제에 직면하여 의존관계를 한 번만 다운로드하면 문제가 해결되었습니다.

EntityManagerFactory 자동 생성을 생략하도록 선택했습니다.따라서 Configuration클래스 중 하나(어플리케이션클래스)에 2개의 콩을 추가해야 합니다.

private static String PROP_DB_DRIVER_CLASS = "spring.db.driver";
private static String PROP_DB_URL = "spring.datasource.url";
private static String PROP_DB_USER = "spring.datasource.username";
private static String PROP_DB_PASS = "spring.datasource.password";

@Autowired
private Environment env;

@Bean
public DataSource dataSource(){
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName(env.getProperty(PROP_DB_DRIVER_CLASS));
      dataSource.setUrl(env.getProperty(PROP_DB_URL));
      dataSource.setUsername(env.getProperty(PROP_DB_USER));
      dataSource.setPassword(env.getProperty(PROP_DB_PASS));
      return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
      LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan("com.sweng.giflib.model");

      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
      em.setJpaVendorAdapter(vendorAdapter);
      em.setJpaProperties(additionalProperties());

      return em;
}

프로젝트에 최대 절전 모드 종속성을 추가하는 것을 잊지 마십시오.

제 경우 문제는exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}되어 있다@SpringBootApplication주석, Kirill Simonov 팁 덕분에 하루 종일 머리를 찾고 브로킹하는 문제를 해결할 수 있었습니다.몇 시간 동안 시도했더니 제거가 아주 잘 됐어요.외 것은@Service, @ @, @Service, @Autowired, @EnableAutoConfiguration과 @ComponentScan은 이 스프링 부트버전에서는 용장성이 있기 때문에 인터넷에서 힌트를 얻는데 많은 시간이 걸립니다.

스프링 부츠 2.1.11을 사용하고 있습니다.릴리즈 버전

프로그래밍은 재미있는 것입니다. 일단 에러 메시지를 해결하기 위해 제외 솔루션을 사용했더니, 지금과 같은 문제가 발생했습니다.마법의 주문이나 공식은 없습니다이 우주에는 많은 다른 시나리오가 있기 때문에우리가 연구했던 것과 비슷하다고 해도

제 경우 mysql 커넥터의 버전을 제거하고 spring boot에 맡겼습니다.그리고 그것은 성공하였다.

했습니다.jooq 의존관계:implementation("org.springframework.boot:spring-boot-starter-jooq")

는 스프링 테스트를Cotrollerrepository그을 다른 클래스로 내의 인 는는 method method method method in in method in in in in in in in in in in in in in in in in in in in the 。Controller.

게다가,Application을 in in in in src\main입니다.src\test 「」를해 주세요.Application뭇매를 맞다

package yourpackage;

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

@SpringBootApplication
public class ApplicationTest {

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

}

그러면 문제가 해결됩니다.

누락된 주석 '@Entity'를 추가하여 해결했습니다.

저는 이 오류를 제거하기 위해 언급된 제안 외에도 여러 가지 방법을 시도했습니다.이 에러는 application.properties에서 다음 코드를 삭제함으로써 해결되었습니다.

spring.jpa.properties.hibernate.cache.use_second_level_cache=true                                                   
spring.jpa.properties.hibernate.cache.use_query_cache=false                                                         
spring.jpa.properties.hibernate.generate_statistics=false                                                           
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory

주석을 추가하면 문제가 해결됨@Enable@SpringBootApplication이 존재하는 클래스의 자동 설정.

언급URL : https://stackoverflow.com/questions/48416927/spring-boot-required-a-bean-named-entitymanagerfactory-that-could-not-be-foun