Bueno, busqué en Google y encontré muchos resultados, pero ninguno de ellos pudo responder a mi problema. Entonces, aquí va.
Estoy tratando de estudiar Spring MVC y Spring Data JPA haciendo una implementación mínima de clon pinterest. Entonces, a continuación se detallan las partes del código que creo que son relevantes para mi problema.
Modelos / Entidades
@Entity
@Table(name = "pin_item")
public class PinItem implements Serializable {
// properties ...
@JoinColumn(name = "board_id", referencedColumnName = "user_board_id")
@ManyToOne(optional = false)
private UserBoard board;
// getters and setters...
}
@Entity
@Table(name = "user_board")
public class UserBoard implements Serializable {
// properties ...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "board")
private List<PinItem> pinItemList;
// getters and setters...
}
Servicio
@Service
@Transactional(readOnly = true)
public class BoardServiceImpl implements BoardService {
@Autowired
private UserBoardRepository boardRepository;
@Override
public List<UserBoard> findLatestBoards() {
PageRequest request = new PageRequest(
0, PresentationUtil.PAGE_SIZE,
Sort.Direction.DESC, "boardId"
);
return boardRepository.findAll(request).getContent();
}
// Other Methods
}
Repositorio
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
Ahora, cuando llamo al findLatestBoards
método BoardService
, se lanza la excepción "No se encontró ninguna propiedad" return boardRepository.findAll(request).getContent();
. Aquí está el extracto de Tomcat Log.
REGISTRO DE DEPURACIÓN
12:28:44,254 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'findLatestBoards' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,254 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager'
12:28:44,254 DEBUG JpaTransactionManager:366 - Creating new transaction with name [com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,254 DEBUG JpaTransactionManager:369 - Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] for JPA transaction
12:28:44,255 DEBUG AbstractTransactionImpl:158 - begin
12:28:44,255 DEBUG LogicalConnectionImpl:212 - Obtaining JDBC connection
12:28:44,255 DEBUG DriverManagerDataSource:162 - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/pic_pin]
12:28:44,266 DEBUG LogicalConnectionImpl:218 - Obtained JDBC connection
12:28:44,267 DEBUG JdbcTransaction:69 - initial autocommit status: true
12:28:44,267 DEBUG JdbcTransaction:71 - disabling autocommit
12:28:44,267 DEBUG JpaTransactionManager:401 - Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@370da60e]
12:28:44,274 DEBUG TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource:286 - Adding transactional method 'findAll' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; ''
12:28:44,274 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager'
12:28:44,274 DEBUG JpaTransactionManager:332 - Found thread-bound EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] for JPA transaction
12:28:44,274 DEBUG JpaTransactionManager:471 - Participating in existing transaction
12:28:44,279 DEBUG CachedIntrospectionResults:159 - Not strongly caching class [java.io.Serializable] because it is not cache-safe
12:28:44,281 DEBUG JpaTransactionManager:851 - Participating transaction failed - marking existing transaction as rollback-only
12:28:44,281 DEBUG JpaTransactionManager:559 - Setting JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] rollback-only
12:28:44,283 DEBUG JpaTransactionManager:844 - Initiating transaction rollback
12:28:44,284 DEBUG JpaTransactionManager:534 - Rolling back JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194]
12:28:44,284 DEBUG AbstractTransactionImpl:203 - rolling back
12:28:44,284 DEBUG JdbcTransaction:164 - rolled JDBC Connection
12:28:44,285 DEBUG JdbcTransaction:126 - re-enabling autocommit
12:28:44,285 DEBUG JpaTransactionManager:594 - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@75284194] after transaction
12:28:44,285 DEBUG EntityManagerFactoryUtils:338 - Closing JPA EntityManager
12:28:44,286 DEBUG LogicalConnectionImpl:232 - Releasing JDBC connection
12:28:44,286 DEBUG LogicalConnectionImpl:250 - Released JDBC connection
12:28:44,287 DEBUG ExceptionHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,289 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,290 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
12:28:44,291 DEBUG DispatcherServlet:959 - Could not complete request
Excepción
La excepción es " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
". Pero, si entendí correctamente, la propiedad board
está presente en PinItem
y está correctamente asignada con mappedBy = "board"
in UserBoard
.
org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:271)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:245)
at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:408)
at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:372)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:456)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:437)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:319)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:289)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:333)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:318)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy147.findAll(Unknown Source)
at com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards(BoardServiceImpl.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy148.findLatestBoards(Unknown Source)
at com.tecnooc.picpin.controller.BoardController.latest(BoardController.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
No entiendo por qué se lanza esta excepción. ¿Alguna idea de por qué está sucediendo?
Nota: Estoy usando Hibernate como proveedor de persistencia. Además, la parte del código que puse aquí es lo que pensé que es relevante para el problema. Si no es así, avíseme y actualizaré la pregunta con la parte requerida.
fuente
Respuestas:
Me encontré con este mismo problema y encontré la solución aquí: https://dzone.com/articles/persistence-layer-spring-data
Cambié el nombre de una propiedad de entidad. Pero con las Consultas personalizadas automáticas de Springs había una interfaz definida para el nombre de la propiedad anterior.
El error indicó que ya no podía encontrar "OldPropName" y arrojó la excepción.
Para citar el artículo sobre DZone:
Cuando Spring Data crea una nueva implementación de repositorio, analiza todos los métodos definidos por las interfaces e intenta generar automáticamente consultas a partir del nombre del método. Si bien esto tiene limitaciones, es una forma muy poderosa y elegante de definir nuevos métodos de acceso personalizado con muy poco esfuerzo. Por ejemplo, si la entidad gestionada tiene un campo de nombre (y el getter y setter estándar de Java Bean para ese campo), la definición del método findByName en la interfaz DAO generará automáticamente la consulta correcta:
Este es un ejemplo relativamente simple; El mecanismo de creación de consultas admite un conjunto mucho más grande de palabras clave.
En el caso de que el analizador no pueda hacer coincidir la propiedad con el campo del objeto de dominio, se genera la siguiente excepción:
fuente
Tu nombre no es correcto .
Según la documentación , si su repositorio es
UserBoardRepository
, la implementación de su repositorio personalizado debe ser un nombre comoUserBoardRepositoryImpl
, aquí lo nombró comoBoardServiceImpl
, por eso arroja la excepción.fuente
BoardServiceImpl
es solo un servicio que utiliza elUserBoardRepository
.Solucionado, al usar
CrudRepository
Spring, tenemos que agregar el nombre de propiedad correctamente después de findBy, de lo contrario, le dará la excepción "No se encontró propiedad para el tipo"Estaba recibiendo esta excepción como. porque el nombre de la propiedad y el nombre del método no estaban sincronizados.
He usado el siguiente código para DB Access.
y mi usuario de dominio tiene propiedad.
fuente
findStatusId
incorrectofindByStatusId
correcto y para verificación de nombres múltiples stackoverflow.com/a/32796493/944593Como su nombre de repositorio JPA es UserBoardRepository , su nombre de interfaz personalizado debe ser UserBoardRepositoryCustom (debe terminar con 'Custom') y su nombre de clase de implementación debe ser UserBoardRepositoryImpl (debe terminar con Impl; puede configurarlo con un postfix diferente usando el repositorio) propiedad impl-postfix )
fuente
este error ocurre si intenta acceder a la propiedad inexistente
Supongo que la clasificación se realiza por primavera
property name
y no porreal column name
. y el error indica que"UserBoard"
no hay ninguna propiedad nombrada"boardId"
.los mejores
Roble
fuente
A
y una claseB
que se extiendeA
y tengo una propiedadx
. Se quejaba de que no podía encontrar propiedadesx
en claseA
...En mi caso, tuve un error tipográfico (caso de camello) en el nombre de mi método. Lo llamé "findbyLastName" y enfrenté esta excepción. Después de cambiarlo a "findByLastName", la excepción desapareció.
fuente
Nota aquí: las respuestas de Zane XY y Alan B. Dee son bastante buenas. Sin embargo, para aquellos de ustedes que usarían Spring Boot ahora y Spring Data, esta es la respuesta más moderna.
Supongamos que tiene una clase como:
Ahora un
JpaRepository
para esto se vería asíAhora su búsqueda "personalizada" por método debe deletrearse
Collection<MyClass> findByMyClassName(String myClassName)
precisamente porque Spring necesita tener algún mecanismo para mapear este método en laMyClass
propiedadmyClassName
!Me di cuenta de esto porque, para mí, parecía natural encontrar una clase por su nombre semánticamente , mientras que, de hecho, sintomáticamente usted encuentre por myClassName
Salud
fuente
parece que su nombre de método JpaRepository personalizado no coincide con ninguna Variable en sus clases de entidad. Asegúrese de que el nombre de su método coincida con una variable en su clase de entidad
por ejemplo: tiene un nombre de variable llamado "activo" y su método JpaRepository personalizado dice "findByActiveStatus" y dado que no hay una variable llamada "activeStatus" arrojará "PropertyReferenceException"
fuente
Verifique el nombre de la propiedad en la llamada definitiva del repositorio de repositorios.
fuente
En JPA, una relación tiene un único propietario, y al usar
mappedBy
en suUserBoard
clase, usted dice quePinItem
es el propietario de esa relación bidireccional, y quePinItem
se nombra la propiedad de la relaciónboard
.En su
UserBoard
clase no tiene ningún campo / propiedad con el nombreboard
, pero tiene una propiedadpinItemList
, por lo que puede intentar usar esa propiedad en su lugar.fuente
Si su proyecto utilizó Spring-Boot, puede intentar agregar estas anotaciones en su Application.java.
fuente
debería recibir la página de uso, como esta
fuente
Debe tener esa propiedad definida en su modelo o clase de entidad.
fuente
Tuve un problema similar que me causó algunas horas de dolor de cabeza.
Mi método de repositorio fue:
Recibí el error de que no se encontró el tipo de propiedad para el tipo ResultClass.
La solución fue que jpa / hibernate no admite plurales. Sin embargo, eliminar la 's' resolvió el problema:
fuente
Recientemente tuve esta excepción cuando me mudé a una nueva versión de arranque por resorte (de 1.5.4 a 1.5.20). El problema estaba en la estructura del paquete del repositorio.
Problema: Bajo el mismo paquete había paquetes: repositorio, repositorioCustom y repositorioImpl.
Solución: reorganice los paquetes del repositorio para que el paquete del repositorio contenga el paquete repositoryCustom y el paquete repositoryCustom contenga el repositorioImpl:
fuente
Otro escenario, que aún no se mencionó aquí, que causó este error es una API que recibe
Pageable
(oSort
) y lo pasa, como está, al repositorio JPA cuando se llama a la API desde Swagger.El valor predeterminado de Swagger para el
Pageable
parámetro es este:Observe
"string"
que existe una propiedad que existe. Ejecutar la API sin eliminarla o cambiarla causaráorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...
fuente