tutorial jparepository example data crudrepository spring jpa inheritance nullpointerexception repository-pattern

jparepository - Spring Data JPA. Herencia de repositorios, arroja BeanCreationException, NullPointerException



spring data repository tutorial (1)

Creo que el PersonRepository debe ser anotado con @NoRepositoryBean .

En mi aplicación lo he hecho de esta manera:

Padre:

@NoRepositoryBean public interface UserRepository<T> extends JpaRepository<T, Long> { }

Niño:

@Repository public interface EmployeeRepository extends UserRepository<Employee> { }

Espero eso ayude.

Así que comencé a usar Spring Data JPA, me resulta muy fácil de usar al principio, especialmente con entidades POJO simples, logré realizar operaciones CRUD simples con una sola entidad (Persona), pero a medida que profundizo en mi diseño (herencia), Estoy empezando a tener problemas para tratar con repositorios Spring JPA cuando se trata de diseño de herencia.

Leyenda:

POJOs

Repositorios

Clase de muestra que usa esos dos arriba

Excepciones lanzadas

configuración xml

Clase de persona (base, clase abstracta)

@MappedSuperclass public abstract class Person { ..properties, getters and setters with hibernate annotations }

Clase de estudiante (niño, extiende Persona)

@Entity @Table(name = "STUDENT") public class Student extends Person { .. properties, getters and setters SPECIFIC for a student }

REPOSITORIOS

PersonRepository (base, repositorio principal)

public interface PersonRepository<T extends Person, ID extends Serializable> extends JpaRepository<T, ID> { }

StudentRepository (child, extends PersonRepository)

public interface StudentRepository extends PersonRepository<Student, Integer>{ }

Clase de muestra

@Service ("manager") public class Manager { @SuppressWarnings("rawtypes") @Resource (name = "personRepository") private PersonRepository personRepository; @SuppressWarnings("unchecked") public void savePerson(Person p) { personRepository.save(p); } }

Excepciones lanzadas

Excepción en el hilo "main" org.springframework.beans.factory.BeanCreationException: error al crear bean con el nombre ''manager'': la inyección de las dependencias de recursos falló; la excepción anidada es org.springframework.beans.factory.BeanCreationException: Error al crear bean con el nombre ''personRepository'': FactoryBean lanzó una excepción en la creación de objetos; la excepción anidada es java.lang.NullPointerException en org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues ​​(CommonAnnotationBeanPostProcessor.java:308) en org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1185) en org .springframework.beans.factory.support.AtracttractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:537) en org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:475) at org.springframework.beans.factory.support .AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:302) en org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:228) en org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory. java: 298) en org.springframework.beans.factory.support.Abstrac tBeanFactory.getBean (AbstractBeanFactory.java:193) en org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:703) en org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:760) en org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:482) en org.springframework.context.support.ClassPathXmlApplicationContext. (ClassPathXmlApplicationContext.java:139) en org.springframework.context.support.ClassPathXmlApplicationContext. (ClassPathXmlApplicationContext) .java: 83) at edu.main.Main.main (Main.java:12) Causado por: org.springframework.beans.factory.BeanCreationException: error al crear bean con el nombre ''personRepository'': FactoryBean lanzó una excepción en la creación de objetos; la excepción anidada es java.lang.NullPointerException en org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean (FactoryBeanRegistrySupport.java:175) en org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean (FactoryBeanRegistrySupport.java:103) en org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance (AbstractBeanFactory.java:1512) en org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:313) en org.springframework.beans.factory .support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:198) en org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource (CommonAnnotationBeanPostProcessor.java:446) en org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource (CommonAnnotationBeanPostProcessor.java:420 ) en org.springframework.context.annotation.CommonAnnotationBeanPostProcessor $ Resou rceElement.getResourceToInject (CommonAnnotationBeanPostProcessor.java:545) at org.springframework.beans.factory.annotation.InjectionMetadata $ InjectedElement.inject (InjectionMetadata.java:155) at org.springframework.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata. java: 87) en org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues ​​(CommonAnnotationBeanPostProcessor.java:305) ... 13 más Causado por: java.lang.NullPointerException en java.lang.Class.isAssignableFrom (Native Method) en org .springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata (JpaEntityInformationSupport.java:58) at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation (JpaRepositoryFactory.java:145) at org.springframework.data .jpa.repository.support.JpaRepositoryFactory.getTargetRepository (JpaRepositoryFactory.java:83) en org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRe pository (JpaRepositoryFactory.java:66) en org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository (RepositoryFactorySupport.java:146) en org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject (RepositoryFactoryBeanSupport. java: 120) en org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject (RepositoryFactoryBeanSupport.java:39) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean (FactoryBeanRegistrySupport.java:168)

Configuración xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:repository="http://www.springframework.org/schema/data/repository" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> <context:annotation-config /> <context:component-scan base-package="edu.service" /> <jpa:repositories base-package="edu.repository" /> <tx:annotation-driven /> <context:property-placeholder location="classpath:properties/database.properties" ignore-unresolvable="false" /> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>edu.domain</value> </list> </property> <property name="persistenceUnitName" value="personPU"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property> <property name="jpaProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">false</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean>

Intento encontrar palabras específicas para buscar un problema similar, pero no tuve suerte, ¿cuál podría ser el problema que hace que mi repositorio no tenga un bean repositorio (una NullPointerException / BeanCreationException) ?. Y otra cosa que quiero agregar, ¿y estoy haciendo algo mal con mi patrón de diseño? ¿Debería reflejar el patrón de herencia de mi POJO en mis repositorios? Estoy tratando de hacer que mi PersonRepository realice operaciones en mi POJO / Entites que son hijos de la clase Person (padre abstracto), por eso se me ocurrió la idea de la herencia del repositorio. Mi objetivo específico es persistir / realizar CRUD en cualquier objeto que extienda a la persona que utiliza PersonRepository. Cualquier ayuda / sugerencia / comentario es muy apreciada. Por favor. Muchas gracias