Java Spring-boot:需要一个无法找到的名为“entityManagerFactory”的 bean
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/48416927/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Spring-boot: required a bean named 'entityManagerFactory' that could not be found
提问by Zahid Anwar
I am developing a Spring Boot application using JPA and encountering this error. I am not certain if I am using the correct annotations or missing dependencies. Any help would be greatly appreciated.
我正在使用 JPA 开发 Spring Boot 应用程序并遇到此错误。我不确定我是否使用了正确的注释或缺少依赖项。任何帮助将不胜感激。
This is the error message
这是错误信息
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
构建.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
Application.java
应用程序.java
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);
}
}
UserService.java
用户服务.java
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
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
用户存储库.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
用户.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;
}
}
回答by Kirill Simonov
You either need to remove exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}
(in this case Spring will automatically configure your datasource) or configure your datasource manually
您需要删除exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}
(在这种情况下 Spring 将自动配置您的数据源)或手动配置您的数据源
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource() {
return new YourCustomDataSource();
}
UPDATE:Seems like you have some mistakes in your properties:
更新:似乎您的属性中有一些错误:
spring.datasource.url== jdbc:mysql://localhost:3306/giflib
spring.db.driver= com.mysql.jdbc.Driver
Try to remove the extra =
from the first line and use spring.datasource.driver-class-name
property name for the second:
尝试=
从第一行中删除额外的内容并spring.datasource.driver-class-name
为第二行使用属性名称:
spring.datasource.url=jdbc:mysql://localhost:3306/giflib
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Also add a version to your MySQL dependency:
还要向您的 MySQL 依赖项添加一个版本:
compile "mysql:mysql-connector-java:6.0.6"
I think that because of these mistakes Spring is unable to autodetect your datasource type correctly.
我认为由于这些错误,Spring 无法正确自动检测您的数据源类型。
回答by Johna
You have chosen to bypass auto creation of EntityManagerFactory. Therefore you should add folowing two beans in one of your configuration classes, possibly in Application class.
您已选择绕过 EntityManagerFactory 的自动创建。因此,您应该在其中一个配置类中添加以下两个 bean,可能在 Application 类中。
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;
}
Don't forget to add the hibernate dependency to your project.
不要忘记将 hibernate 依赖项添加到您的项目中。
回答by user9347049
Run into same issue when trying to connect spring boot to mysql database.
尝试将 spring boot 连接到 mysql 数据库时遇到同样的问题。
What saved me was adding correct version of hibernate-core to my pom file.
From hibernate onwards 5.2.0. hibernate-entitymanager is no longer needed. Hibernate-core 5.2.0 have problem with Spring Data JPA while process collection.Hibernate-core 5.2.1
and above is ok with Spring Data JPA if you are using Spring Data JPA.
拯救我的是将正确版本的 hibernate-core 添加到我的 pom 文件中。从休眠 5.2.0 开始。不再需要 hibernate-entitymanager。Hibernate-core 5.2.0 在处理收集时存在 Spring Data JPA 问题。Hibernate-core 5.2.1
如果您使用的是 Spring Data JPA,则 Spring Data JPA 以上都可以。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version> 5.2.1.Final</version>
</dependency>
回答by Istiaque Hossain
I was getting error message like "required a bean named 'entityManagerFactory' that could not be found."
我收到错误消息,例如“需要一个无法找到的名为‘entityManagerFactory’的 bean”。
After lot of googling solve this problem. I set manual configuration for JPA.
经过大量的谷歌搜索解决了这个问题。我为 JPA 设置了手动配置。
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
return sessionFactory;
}
but JPA by default search sessionFactory by name 'entityManagerFactory' so change my code as:
但 JPA 默认按名称搜索 sessionFactory ' entityManagerFactory'所以将我的代码更改为:
@Bean(name="entityManagerFactory")
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
return sessionFactory;
}
回答by avaneesh kumar Shukla
I tried several ways besides of mentioned suggestions to remove this error.I got resolved this error by just removing following code from application.properties
除了提到的建议之外,我还尝试了多种方法来消除此错误。只需从 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
回答by Wellington DC
In my case the problem was exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}
declared in @SpringBootApplication
annotation, so thanks to Kirill Simonov tip I solved the problem that spent all day long of searching and broking head. Removing it worked extremely fine for me after hours trying. Everything else was ok, @Service, @Autowired, @EnableAutoConfiguration and @ComponentScan are redundant in this spring boot version, so really much time trying tips in the internet.
在我的例子中,问题是exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}
在@SpringBootApplication
注释中声明的,所以感谢 Kirill Simonov 的提示,我解决了花了一整天的时间寻找和解决问题的问题。经过数小时的尝试,删除它对我来说非常好。其他一切都很好,@Service、@Autowired、@EnableAutoConfiguration 和 @ComponentScan 在这个 Spring Boot 版本中是多余的,所以真的有很多时间在互联网上尝试技巧。
I'm using spring boot 2.1.11.RELEASE version.
我正在使用 spring boot 2.1.11.RELEASE 版本。
Programming is something funny, once I used the exclude solution to solve an error message, then the same thing was the problem now. So there's no magic spell or formula as this universe has lots and lots of different scenarios, even if it's similar to a previous one we worked on.
编程是一件很有趣的事情,一旦我使用排除解决方案来解决错误消息,那么现在的问题就是同样的事情。所以没有魔法咒语或公式,因为这个宇宙有很多不同的场景,即使它与我们之前研究过的场景相似。
回答by Abdulrahman Hashem
For me, I've forgotten to remove DataSourceAutoConfiguration.class
from exclusions.
对我来说,我忘记DataSourceAutoConfiguration.class
从排除项中删除。
So this:
所以这:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
// Main class definition
Should be:
应该:
@SpringBootApplication()
// Main class definition