복붙노트

[SPRING] Spring Data JPA - 구성에 'entityManagerFactory'라는 bean 정의를 고려하십시오.

SPRING

Spring Data JPA - 구성에 'entityManagerFactory'라는 bean 정의를 고려하십시오.

Tomcat, Mysql5, Java8을 사용하여 Spring에서 응용 프로그램을 개발 중입니다 ... 문제는 "required bean 'entityManagerFactory'not found"문제로 인해 배포 할 수 없다는 것입니다. 동료들과 함께이 프로젝트를 개발했지만 Spring Tool Suite에서 같은 프로젝트를 복사하여 붙여 넣기를해도 문제없이 완벽하게 배포 할 수 있습니다. 어떻게 가능할까요? 오류:

    2016-12-15 17:41:12.777  WARN 3676 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'controlador': Unsatisfied dependency expressed through field 'usuarioDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usuarioRepository': Cannot create inner bean '(inner bean)#59e43e8c' 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)#59e43e8c': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
2016-12-15 17:41:12.783  INFO 3676 --- [           main] o.apache.catalina.core.StandardService   : Stopping service Tomcat
2016-12-15 17:41:12.807  WARN 3676 --- [ost-startStop-1] o.a.c.loader.WebappClassLoaderBase       : The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
2016-12-15 17:41:12.826  INFO 3676 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2016-12-15 17:41:12.940 ERROR 3676 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

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

Description:

Field usuarioDao in es.uc3m.tiw.Controladores.Controlador required a bean named 'entityManagerFactory' that could not be found.


Action:

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

다음은 내 pom.xml입니다.

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>es.uc3m.tiw</groupId>
    <artifactId>Cliente</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Cliente</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>   

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

여기 내 저장소가있다.

    package es.uc3m.tiw.Daos;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import es.uc3m.tiw.dominios.Usuario;

public interface UsuarioRepository  extends JpaRepository<Usuario, Long> {

    List<Usuario> findAll();

    Usuario findByNombre(String nombre);
}

여기 내 컨트롤러가있다.

package es.uc3m.tiw.Controladores;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import es.uc3m.tiw.Daos.AdministradorRepository;
import es.uc3m.tiw.Daos.UsuarioRepository;
import es.uc3m.tiw.dominios.Administrador;
import es.uc3m.tiw.dominios.Usuario;

@RestController
public class Controlador {

@Autowired
private UsuarioRepository usuarioDao;
private AdministradorRepository administradorDao;



    @RequestMapping(value="/registroUsuario", method = RequestMethod.POST)
    public @ResponseBody Usuario registrarUsuario(@RequestBody Usuario usuarioARegistrar){
    usuarioDao.save(usuarioARegistrar); //guardar, editar, borrar, findbyOne(Primary key) son métodos que vienen implementados ya en el CrudRepository
    return usuarioARegistrar;
    }

    @RequestMapping(value="/editarUsuario", method = RequestMethod.POST)
    public @ResponseBody Usuario editarUsuario(Usuario usuarioAEditar){
            usuarioAEditar.setNombre(usuarioAEditar.getNombre());
            usuarioAEditar.setApellidos(usuarioAEditar.getApellidos());
            usuarioAEditar.setCiudad(usuarioAEditar.getCiudad());
            usuarioAEditar.setEmail(usuarioAEditar.getEmail());
            usuarioAEditar.setPassword(usuarioAEditar.getPassword());
            usuarioDao.save(usuarioAEditar);            
    return usuarioAEditar;
    }

    @RequestMapping(value="/eliminarUsuario", method = RequestMethod.DELETE)
    public @ResponseBody Usuario eliminarUsuario(Usuario usuarioAEliminar){
    usuarioDao.delete(usuarioAEliminar);
    return usuarioAEliminar;
    }

    @RequestMapping(value="/validar" ,method = RequestMethod.POST)
    public  @ResponseBody Usuario loginUsuario(@RequestBody Usuario usuarioPendiente){
    Usuario usuarioLogeado = null;
    List <Usuario> usuarios = usuarioDao.findAll();
    usuarioLogeado = comprobarUsuario(usuarios, usuarioPendiente.getEmail(),usuarioPendiente.getPassword()); 
    return usuarioLogeado;
    }

    @RequestMapping(value="/verPerfilUsuario", method = RequestMethod.GET)
    public @ResponseBody Usuario verPerfilUsuario(Usuario usuarioAMostrar){
        usuarioAMostrar.getNombre();
        usuarioAMostrar.getApellidos();
        usuarioAMostrar.getCiudad();
        usuarioAMostrar.getEmail();
        usuarioAMostrar.getPassword();
    return usuarioAMostrar;
    }

    @RequestMapping(value="/loginAdministrador" ,method = RequestMethod.POST)
    public  @ResponseBody Administrador loginAdministrador(@RequestBody Administrador administradorPendiente){
        Administrador administradorLogeado = null;
        List <Administrador> administradores = administradorDao.findAll();
        administradorLogeado = comprobarAdministrador(administradores, administradorPendiente.getEmail(),administradorPendiente.getPassword());
        return administradorLogeado;
    }

    private Usuario comprobarUsuario( List<Usuario> usuarios, String email, String password) {
            Usuario u = null;
            for (Usuario usuario : usuarios) {
                    if (email.equals(usuario.getEmail()) && password.equals(usuario.getPassword())){
                            u = usuario;
                            break;
                            }
                    }
            return u;
        } 

    private Administrador comprobarAdministrador( List<Administrador> administradores, String email, String password) {
        Administrador ad = null;
        for (Administrador administrador : administradores) {
                if (email.equals(administrador.getEmail()) && password.equals(administrador.getPassword())){
                        ad = administrador;
                        //break;
                        }
                }
        return ad;
    }
}

Application.properties

server.port=8010
spring.datasource.url=jdbc:mysql://localhost:3306/tiw
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name = com.mysql.jdbc.Driver

spring.jpa.hibernate.ddl-auto = update

실재

package es.uc3m.tiw.dominios;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="USUARIOS")
public class Usuario implements Serializable {

        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private long id;
        @Column(length = 25)
        private String nombre;
        @Column(length = 25)
        private String apellidos;
        @Column(length = 25)
        private String ciudad;
        @Column(length = 25, nullable = false, unique = true)
        private String email;
        @Column(length = 25, nullable = false)
        private String password;


        public Usuario() {
        }

        public Usuario(long id, String nombre, String apellidos, String ciudad, String password, String email) {
            super();
            this.id = id;
            this.nombre = nombre;
            this.apellidos = apellidos;
            this.ciudad = ciudad;
            this.password = password;
            this.email = email;
        }

        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }       
        public String getNombre() {
            return nombre;
        }       
        public void setNombre(String nombre) {
            this.nombre = nombre;
        }       
        public String getApellidos() {
            return apellidos;
        }   
        public void setApellidos(String apellidos) {
            this.apellidos = apellidos;
        }       
        public String getCiudad() {
            return ciudad;
        }
        public void setCiudad(String ciudad) {
            this.ciudad = ciudad;
        }       
        public String getPassword() {
            return password;
        }       
        public void setPassword(String password) {
            this.password = password;
        }   
        public String getEmail() {
            return email;
        }   
        public void setEmail(String email) {
            this.email = email;
        }
}

여기 내 주머니가있다.

package es.uc3m.tiw;

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

@SpringBootApplication
public class ClienteSpringApplication {

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

해결법

  1. ==============================

    1.나는 똑같은 문제가 있었다. 내가 maven 빌드 로그를 검사했을 때 "잘못된 LOC 헤더 (잘못된 서명)"에 대해 불평하는 최대 절전 모드 패키지에 관한 오류가 있다는 것을 깨달았습니다. .m2 \ repository \ org \ hibernate \ hibernate-core 아래의 하위 디렉토리를 삭제하고 프로젝트를 다시 컴파일하여 해결했습니다.

    나는 똑같은 문제가 있었다. 내가 maven 빌드 로그를 검사했을 때 "잘못된 LOC 헤더 (잘못된 서명)"에 대해 불평하는 최대 절전 모드 패키지에 관한 오류가 있다는 것을 깨달았습니다. .m2 \ repository \ org \ hibernate \ hibernate-core 아래의 하위 디렉토리를 삭제하고 프로젝트를 다시 컴파일하여 해결했습니다.

  2. ==============================

    2.@Repository를 사용하여 구성해야하므로 저장소 구성이 누락되었습니다.

    @Repository를 사용하여 구성해야하므로 저장소 구성이 누락되었습니다.

    다음은 잘못되었습니다.

    public interface UsuarioRepository  extends JpaRepository<Usuario, Long> {
    

    오히려 다음과 같이 저장소로 구성되어야합니다.

    @Repository
    public interface UsuarioRepository  extends JpaRepository<Usuario, Long> {
    

    이렇게하면 빈을 스캔하여 저장소로 취급하고 다음 코드가 예상대로 작동해야합니다.

    @Autowired
    private UsuarioRepository usuarioDao;
    
  3. ==============================

    3.pom 파일의 persistence-api를 확인하고 spring-boot-started-data-jpa jar의 일부인 hibernate-jpa-2.1을 사용하여 변경하십시오.

    pom 파일의 persistence-api를 확인하고 spring-boot-started-data-jpa jar의 일부인 hibernate-jpa-2.1을 사용하여 변경하십시오.

  4. ==============================

    4.ClienteSpringApplication에는 @Configuration, @EnableAutoConfiguration 및 @ComponentScan에 해당하는 @SpringBootApplication 주석 만 있습니다. 당신이 누락 된 것은 @EnableJpaRepositories 주석입니다.

    ClienteSpringApplication에는 @Configuration, @EnableAutoConfiguration 및 @ComponentScan에 해당하는 @SpringBootApplication 주석 만 있습니다. 당신이 누락 된 것은 @EnableJpaRepositories 주석입니다.

    package es.uc3m.tiw;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @EnableJpaRepositories
    public class ClienteSpringApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ClienteSpringApplication.class, args);
        }
    }
    

    위와 같이 작동하지 않으면 저장소의 패키지도 추가하십시오.

    @EnableJpaRepositories("es.uc3m.tiw.dominios")
    
  5. ==============================

    5.필자의 경우 드라이버 클래스가 들어있는 h2-1.4.193.jar 파일 이었지만 다음과 같이 읽을 수는 없습니다 (매우 이상하게 손상되었을 수도 있음). h2-1.4.193의 드라이버 클래스

    필자의 경우 드라이버 클래스가 들어있는 h2-1.4.193.jar 파일 이었지만 다음과 같이 읽을 수는 없습니다 (매우 이상하게 손상되었을 수도 있음). h2-1.4.193의 드라이버 클래스

    따라서, de-boot-startter-parent를 1.5.3.RELEASE (또는 최신 버전)로 업데이트하거나 h2 종속성의 관리되는 버전을 무시할 수 있습니다.

  6. ==============================

    6.JpaRepository에서 @Repository 주석을 추가했는지 확인하십시오. 모든 엔티티 Setter 및 Getter를 작성했는지 확인하십시오. 청결하고 지어 라. 다음을 실행합니다.

    JpaRepository에서 @Repository 주석을 추가했는지 확인하십시오. 모든 엔티티 Setter 및 Getter를 작성했는지 확인하십시오. 청결하고 지어 라. 다음을 실행합니다.

  7. ==============================

    7.필자가 hibernate-core.jar 파일을 삭제하고 종속성을 설치하면 Maven에 의해로드 된 jar 의존성에주의해야한다. 건배.

    필자가 hibernate-core.jar 파일을 삭제하고 종속성을 설치하면 Maven에 의해로드 된 jar 의존성에주의해야한다. 건배.

  8. from https://stackoverflow.com/questions/41170661/spring-data-jpa-consider-defining-a-bean-named-entitymanagerfactory-in-your by cc-by-sa and MIT license