Spring Data JPA – Exception «Aucune propriété trouvée pour le type»

Eh bien, j’ai cherché Google et trouvé de nombreux résultats, mais aucun d’entre eux n’a pu répondre à mon problème. Donc, ça va.

J’essaie d’étudier Spring MVC et Spring Data JPA en effectuant une implémentation minimale du clone pinterest. Donc, voici les parties du code qui, selon moi, 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 pinItemList; // getters and setters... } 

Un service

 @Service @Transactional(readOnly = true) public class BoardServiceImpl implements BoardService { @Autowired private UserBoardRepository boardRepository; @Override public List 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 { } 

Maintenant, lorsque j’appelle la méthode findLatestBoards dans BoardService , l’ BoardService “Aucune propriété trouvée” est levée sur la ligne return boardRepository.findAll(request).getContent(); . Voici l’extrait du journal de Tomcat.

JOURNAL DE DÉBOGAGE

 12:28:44,254 DEBUG AnnotationTransactionAtsortingbuteSource:106 - Adding transactional method 'findLatestBoards' with atsortingbute: 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$CustomAnnotationTransactionAtsortingbuteSource:286 - Adding transactional method 'findAll' with atsortingbute: 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.Ssortingng 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.Ssortingng 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.Ssortingng 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" dans UserBoard .

 org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard at org.springframework.data.mapping.PropertyPath.(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 ce qui se passe?

Remarque: J’utilise Hibernate en tant que fournisseur de persistance. En outre, la partie du code que je mets ici est ce que je pensais être pertinent pour le problème. Si ce n’est pas le cas, faites le moi savoir et je mettrai à jour la question avec la partie requirejse.

J’ai rencontré ce même problème et trouvé la solution ici: http://java.dzone.com/articles/persistence-layer-spring-data

J’ai renommé une propriété d’entité. Mais avec Springs Automatic Custom Queries, une interface était définie pour l’ancien nom de propriété.

 public interface IFooDAO extends JpaRepository< Foo, Long >{ Foo findByOldPropName( final Ssortingng name ); } 

L’erreur indique qu’il ne peut plus trouver “OldPropName” et lance l’exception.

Pour citer l’article sur DZone:

Lorsque Spring Data crée une nouvelle implémentation du référentiel, il parsing 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 présente des limites, c’est un moyen très puissant et élégant de définir de nouvelles méthodes d’access 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:

 public interface IFooDAO extends JpaRepository< Foo, Long >{ Foo findByName( final Ssortingng name ); } 

Ceci est un exemple relativement simple. un ensemble beaucoup plus important de mots-clés est pris en charge par le mécanisme de création de requêtes.

Si l’parsingur ne peut pas correspondre à la propriété avec le champ d’object de domaine, l’exception suivante est générée:

 java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo 

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 UserBoardRepositoryImpl , ici vous l’avez nommé BoardServiceImpl , c’est pourquoi il génère l’exception.

Corrigé, tout en utilisant CrudRepository of Spring, nous devons append le propertyname correctement après findBy sinon il vous donnera une exception “Aucune propriété trouvée pour le type”

Je recevais 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.

 public interface UserDao extends CrudRepository { User findByUsername(Ssortingng username); 

et mon utilisateur de domaine possède une propriété.

 @Entity public class User implements UserDetails { /** * */ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "userId", nullable = false, updatable = false) private Long userId; private Ssortingng username; 

Étant donné que votre nom de référentiel JPA est UserBoardRepository , votre nom d’interface personnalisé doit être UserBoardRepositoryCustom (il doit se terminer par «Custom») et votre nom de classe d’implémentation doit être UserBoardRepositoryImpl ( Impl) ; propriété impl-postfix )

cette erreur se produit si vous essayez d’accéder à la propriété un-exist

Je suppose que le sorting est effectué au spring par property name et non par real column name . et l’erreur indique que, dans "UserBoard" il n’y a pas de propriété nommée "boardId" .

les meilleurs,

Chêne

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.

Notez 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 et Spring Data, voici une réponse plus moderne.

Supposons que vous ayez une classe telle que:

 @Entity class MyClass { @Id @GeneratedValue private Long id; private Ssortingng myClassName; } 

Maintenant, un JpaRepository pour cela ressemblerait

 interface MyClassRepository extends JpaRepository { Collection findByMyClassName(Ssortingng myClassName); } 

Maintenant, votre recherche “personnalisée” par méthode doit épeler Collection findByMyClassName(Ssortingng myClassName) précisément parce que Spring doit avoir un mécanisme pour mapper cette méthode sur la propriété myClassName !

J’ai compris cela parce que, pour moi, il semblait naturel de trouver une classe par son nom de manière sémantique , alors qu’en fait, myClassName

À votre santé

Dans JPA, une relation a un propriétaire unique et en utilisant mappedBy dans votre classe UserBoard , vous indiquez que PinItem est le propriétaire de cette relation bidirectionnelle et que la propriété dans PinItem de la relation est nommée board .

Dans votre classe UserBoard , vous n’avez pas de champs / propriétés avec le board nom, mais il possède une propriété pinItemList , vous pouvez donc essayer d’utiliser cette propriété à la place.

Si votre projet a utilisé Spring-Boot, vous pouvez essayer d’append ces annotations à votre application.java.

 @EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class) @SpringBootApplication public class Application {.....