it-swarm.com.de

Spring Data JPA - Sie können in Ihrer Konfiguration eine Bean mit dem Namen 'entityManagerFactory' definieren

Ich entwickle gerade eine Anwendung in Spring, die Tomcat, Mysql5, Java8 verwendet ... Das Problem ist, dass ich sie nicht implementieren kann, da das Problem "Bean" nicht gefunden wurde. Ich habe dieses Projekt zusammen mit meinen Kollegen entwickelt, aber sie können es problemlos einsetzen, auch wenn ich dasselbe Projekt in Spring Tool Suite kopiere. Wie kann das möglich sein? Fehler:

    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.

Hier ist meine 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>

Hier ist mein Repository

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

Hier ist mein Controller

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

Anwendungseigenschaften

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

Entität

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

Hier ist mein Haupt

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

Ich hatte genau das gleiche Problem. Bei der Überprüfung des Maven Build-Protokolls habe ich festgestellt, dass ein Fehler in Bezug auf Hibernate-Pakete aufgetreten ist, die sich über "ungültigen LOC-Header (ungültige Signatur)" beschweren. Ich löste das Problem, indem ich Unterverzeichnisse unter .m2\repository\org\hibernate\hibernate-core löschte und mein Projekt neu kompilierte.

4
HSamiSari

Es fehlt die Repository-Konfiguration, da Sie sie mit @Repository konfigurieren müssen.

Folgendes ist falsch

public interface UsuarioRepository  extends JpaRepository<Usuario, Long> {

Es sollte vielmehr als Repository wie folgt konfiguriert werden:

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

Dadurch wird es zu einer Bean, die gescannt werden soll, und als Repository behandelt. Anschließend sollte der folgende Code wie erwartet funktionieren

@Autowired
private UsuarioRepository usuarioDao;
3
ScanQR

Überprüfen Sie die Persistenz-API in der POM-Datei und versuchen Sie, mit Hibernate-jpa-2.1 zu wechseln, das Teil von Spring-Boot-Started-Data-Jpa-Jar ist

1
Deepu Surendran

In Ihrer ClienteSpringApplication haben Sie nur die Annotation @SpringBootApplication, die äquivalent zu @Configuration, @EnableAutoConfiguration und @ComponentScan ist. Was Ihnen fehlt, ist die Annotation @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);
    }
}

Wenn dies nicht funktioniert, fügen Sie auch das Paket Ihres Repositorys hinzu:

@EnableJpaRepositories("es.uc3m.tiw.dominios")
1
Alex P.

stellen Sie sicher, dass Sie @Repository-Annotation in JpaRepository .__ hinzugefügt haben. Stellen Sie sicher, dass Sie alle Entität Setter und Getter clean und build

0

In meinem Fall war die Datei h2-1.4.193.jar, die die Driver-Klasse enthält, aber nicht gelesen werden kann (sehr seltsam, möglicherweise beschädigt), wie Sie sehen: Driver-Klasse von h2.) -1.4.193

Sie können also de spring-boot-starter-parent auf 1.5.3.RELEASE (oder neuer) aktualisieren oder die verwaltete Version Ihrer h2-Abhängigkeit überschreiben.

0
carvo

Seien Sie vorsichtig mit jars Abhängigkeiten, die von Maven geladen wurden. In meinem Fall war hibernate-core.jar beschädigt. Sobald ich diese Abhängigkeit entfernt und installiert habe, läuft das Projekt in Ordnung.