Eh bien, j'ai cherché sur Google et trouvé de nombreux résultats, mais aucun d'entre eux n'a pu répondre à mon problème. Alors, voilà.
J'essaie d'étudier Spring MVC et Spring Data JPA en faisant une implémentation minimale du clone pinterest. Voici donc les parties de code qui, à mon avis, sont pertinentes pour mon problème.
Modèles / Entités
@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...
}
Un service
@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
}
Dépôt
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
Maintenant, lorsque j'appelle la findLatestBoards
méthode BoardService
, l'exception "Aucune propriété trouvée" est lancée sur la ligne return boardRepository.findAll(request).getContent();
. Voici l'extrait du journal tomcat.
JOURNAL DE DÉBOGAGE
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
Exception
L'exception est " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
". Mais, si j'ai bien compris, la propriété board
est présente dans PinItem
et est correctement mappée avec 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)
Je ne comprends pas pourquoi cette exception est levée. Une idée de pourquoi cela se produit?
Remarque: j'utilise Hibernate comme fournisseur de persistance. En outre, la partie de code que j'ai mise ici est ce que je pensais être pertinente pour le problème. Si ce n'est pas le cas, faites-le moi savoir et je mettrai à jour la question avec la partie requise.
la source
Réponses:
J'ai rencontré ce même problème et j'ai trouvé la solution ici: https://dzone.com/articles/persistence-layer-spring-data
J'avais renommé une propriété d'entité. Mais avec les requêtes personnalisées automatiques Springs, une interface était définie pour l'ancien nom de propriété.
L'erreur a indiqué qu'il ne pouvait plus trouver "OldPropName" et a levé l'exception.
Pour citer l'article sur DZone:
Lorsque Spring Data crée une nouvelle implémentation de référentiel, il analyse toutes les méthodes définies par les interfaces et tente de générer automatiquement des requêtes à partir du nom de la méthode. Bien que cela ait des limites, c'est un moyen très puissant et élégant de définir de nouvelles méthodes d'accès personnalisées avec très peu d'effort. Par exemple, si l'entité gérée a un champ de nom (et le getter et le setter standard Java Bean pour ce champ), la définition de la méthode findByName dans l'interface DAO générera automatiquement la requête correcte:
Ceci est un exemple relativement simple; un ensemble beaucoup plus grand de mots-clés est pris en charge par le mécanisme de création de requêtes.
Dans le cas où l'analyseur ne peut pas faire correspondre la propriété avec le champ d'objet de domaine, l'exception suivante est levée:
la source
Votre nom n'est pas correct .
Selon la documentation , si votre référentiel est
UserBoardRepository
, l'implémentation de votre référentiel personnalisé doit être name asUserBoardRepositoryImpl
, ici vous l'avez nommé commeBoardServiceImpl
, c'est pourquoi il lève l'exception.la source
BoardServiceImpl
est juste un service utilisant leUserBoardRepository
.Correction, lors de l'utilisation
CrudRepository
de Spring, nous devons ajouter correctement le nom de propriété après findBy, sinon cela vous donnera l'exception "Aucune propriété trouvée pour le type"J'obtenais cette exception comme. car le nom de la propriété et le nom de la méthode n'étaient pas synchronisés.
J'ai utilisé le code ci-dessous pour DB Access.
et mon utilisateur de domaine a la propriété.
la source
findStatusId
incorrectfindByStatusId
correct et pour plusieurs noms, vérifiez stackoverflow.com/a/32796493/944593Étant donné que le nom de votre référentiel JPA est UserBoardRepository , votre nom d'interface personnalisé doit être UserBoardRepositoryCustom (il doit se terminer par `` Custom '') et le nom de votre classe d'implémentation doit être UserBoardRepositoryImpl (doit se terminer par Impl; vous pouvez le définir avec un suffixe différent en utilisant le référentiel- propriété impl-postfix )
la source
cette erreur se produit si vous essayez d'accéder à une propriété qui n'existe pas
je suppose que le tri se fait au printemps
property name
et non au printempsreal column name
. et l'erreur indique qu'il"UserBoard"
n'y a pas de propriété nommée"boardId"
.les meilleurs,
Chêne
la source
A
et une classeB
qui s'étendentA
et ont une propriétéx
. Il se plaignait de ne pas pouvoir trouver de propriétéx
en classeA
...Dans mon cas, j'avais une faute de frappe (cas de chameau) dans le nom de ma méthode. Je l'ai nommé "findbyLastName" et j'ai fait face à cette exception. Après que je l'ai changé en "findByLastName", l'exception a disparu.
la source
Remarquez ici: les réponses de Zane XY et Alan B. Dee sont plutôt bonnes. Pourtant, pour ceux d'entre vous qui utiliseraient Spring Boot maintenant et Spring Data, voici ce qui serait une réponse plus moderne.
Supposons que vous ayez une classe telle que:
Maintenant un
JpaRepository
pour cela ressemblerait àMaintenant, votre recherche "personnalisée" par méthode doit être orthographiée
Collection<MyClass> findByMyClassName(String myClassName)
précisément parce que Spring a besoin d'un mécanisme pour mapper cette méthode sur laMyClass
propriétémyClassName
!J'ai compris cela parce que, pour moi, il me semblait naturel trouver une classe par son nom sémantiquement , alors qu'en fait, synatxiquement, vous trouvez par myClassName
À votre santé
la source
il semble que le nom de votre méthode JpaRepository personnalisée ne correspond à aucune variable de vos classes d'entité. Assurez-vous que le nom de votre méthode correspond à une variable de votre classe d'entité
par exemple: vous avez un nom de variable appelé "active" et votre méthode JpaRepository personnalisée dit "findByActiveStatus" et comme il n'y a pas de variable appelée "activeStatus", elle lancera "PropertyReferenceException"
la source
Veuillez vérifier le nom de la propriété dans l'appel par défaut du référentiel ei repo.findByUsername (nom d'utilisateur)
la source
Dans JPA, une relation a un seul propriétaire, et en utilisant
mappedBy
dans votreUserBoard
classe, vous indiquez qu'ilPinItem
est le propriétaire de cette relation bidirectionnelle et que la propriétéPinItem
de la relation est nomméeboard
.Dans votre
UserBoard
classe, vous n'avez aucun champ / propriété avec le nomboard
, mais il a une propriétépinItemList
, vous pouvez donc essayer d'utiliser cette propriété à la place.la source
Si votre projet a utilisé Spring-Boot, vous pouvez essayer d'ajouter ces annotations dans votre Application.java.
la source
vous devriez recevoir une page d'utilisation , comme celle-ci
la source
Vous devez avoir cette propriété définie dans votre modèle ou classe d'entité.
la source
J'ai eu un problème similaire qui m'a causé quelques heures de maux de tête.
Ma méthode de dépôt était:
J'ai eu l'erreur, que le type de propriété n'a pas été trouvé pour le type ResultClass.
La solution était que jpa / hibernate ne prend pas en charge les pluriels? Néanmoins, la suppression des 's' a résolu le problème:
la source
J'ai eu cette exception récemment lors du passage à une version plus récente à démarrage à ressort (de 1.5.4 à 1.5.20). Le problème était dans la structure du package du référentiel.
Problème: Sous le même package se trouvaient des packages: repository, repositoryCustom et repositoryImpl.
Solution: Réorganisez les packages du référentiel de sorte que le package du référentiel contienne le référentiel Le package personnalisé et le référentiel Le package personnalisé contient le référentielImpl:
la source
Un autre scénario, qui n'a pas encore été mentionné ici, qui a causé cette erreur est une API qui la reçoit
Pageable
(ouSort
) et la transmet, telle quelle, au référentiel JPA lors de l'appel de l'API depuis Swagger.La valeur par défaut de Swagger pour le
Pageable
paramètre est la suivante:Remarquez le
"string"
là qui est une propriété qui existe. L'exécution de l'API sans la supprimer ni la modifier entraîneraorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...
la source