web-dev-qa-db-fra.com

Spring Data JPA - Exception "Aucune propriété trouvée pour le type"

Eh bien, j'ai cherché sur Google et trouvé de nombreux résultats, mais aucun d'entre eux n'a été en mesure de répondre à mon problème. Alors, voilà.

J'essaie d'étudier Spring MVC et Spring Data JPA en effectuant 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...
}

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
}

référentiel

public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {

}

Maintenant, lorsque j'appelle la méthode findLatestBoards dans BoardService, une exception "Aucune propriété trouvée" est renvoyé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 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" dans 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 pourquoi ça se passe?

Note: J'utilise Hibernate en tant que fournisseur de persistance. En outre, la partie de code que je mets ici correspond à ce que je pensais être pertinente au problème. Si ce n'est pas le cas, faites-le moi savoir et je mettrai à jour la question avec la partie requise.

103
Jomoos

J'ai rencontré le 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 avait été définie pour l'ancien nom de la propriété.

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

L'erreur indiquait qu'il ne pouvait plus trouver "OldPropName" et lançait 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 présente des limites, il s'agit d'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 configurateur standard de bean Java 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 String name );
}

Ceci est un exemple relativement simple; Le mécanisme de création de requête prend en charge un ensemble beaucoup plus vaste de mots-clés.

Si l'analyseur ne peut pas faire correspondre la propriété au champ d'objet de domaine, l'exception suivante est levée:

Java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo
117
Alan B. Dee

Votre nom n'est pas correct .

Conformément à la documentation , si votre référentiel est UserBoardRepository, son implémentation personnalisée doit porter le nom UserBoardRepositoryImpl, ici vous l'avez nommé BoardServiceImpl, pourquoi il jette l'exception.

73
Zane XY

Correction, en utilisant CrudRepository of Spring, nous devons ajouter le nom de propriété correctement après findBy, sinon vous obtiendrez une exception "Aucune propriété trouvée pour le type"

Je recevais cette exception comme. parce que 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 l'accès à la base de données.

public interface UserDao extends CrudRepository<User, Long> {
    User findByUsername(String username);

et mon utilisateur de domaine a la 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 String username;
37
Kumar Abhishek

Comme votre nom de référentiel JPA est serBoardRepository, votre nom d'interface personnalisé doit être serBoardRepositoryCustom (il doit se terminer par 'Custom') et votre nom de classe d'implémentation doit être serBoardRepositoryImpl (devrait se terminer par Impl; vous pouvez le définir avec un postfix différent en utilisant la propriété repository-impl-postfix )

25
Abhilash

cette erreur se produit si vous essayez d'accéder à la propriété non existante

je suppose que le tri est effectué au printemps 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".

meilleurs

Chêne

15
oak

Dans mon cas, j'avais une faute de frappe (cas du chameau) dans le nom de ma méthode. Je l'ai nommé "findbyLastName" et ai fait face à cette exception. Après que je l'ai changé en "findByLastName" exception a disparu.

7
horizon7

Notez ici: les réponses de Zane XY et Alan B. Dee sont plutôt bonnes. Pourtant, pour ceux qui utiliseraient Spring Boot maintenant 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 String myClassName;
}

Maintenant un JpaRepository pour cela ressemblerait

interface MyClassRepository extends JpaRepository {
    Collection<MyClass> findByMyClassName(String myClassName);
}

Maintenant, votre méthode "personnalisée" trouvée par doit épeler Collection<MyClass> findByMyClassName(String myClassName) précisément parce que Spring doit disposer d'un mécanisme permettant de mapper cette méthode sur MyClass propriété myClassName!

J'ai compris cela parce que, pour moi, il me semblait naturel de trouver une classe par son nom sémantiquement, alors qu'en fait, synatxiquement vous trouvez par myClassName

À votre santé

6
avi.elkharrat

J'ai eu un problème similaire qui m'a causé quelques heures de maux de tête.

Ma méthode de référentiel était:

public List<ResultClass> findAllByTypeAndObjects(String type, List<Object> objects);

J'ai eu l'erreur, que le type de propriété était introuvable pour le type ResultClass.

La solution était que jpa/hibernate ne supporte pas les pluriels? Néanmoins, supprimer le 's' a résolu le problème:

public List<ResultClass> findAllByTypeAndObjects(String type, List<Object>
0
mirisbowring

Vous devez définir cette propriété dans votre modèle ou votre classe d'entités.

0
Dila Gurung

Dans JPA, une relation a un seul propriétaire 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é board.

Dans votre classe UserBoard, vous n'avez aucun champ/propriété portant le nom board, mais une propriété pinItemList. Vous pouvez donc essayer d'utiliser cette propriété à la place.

0
Andrei I

vous devriez recevoir la page d'utilisation , comme ceci

 @Override
public Page<UserBoard> findLatestBoards() {
    PageRequest request = new PageRequest(
                 0, PresentationUtil.PAGE_SIZE, 
                 Sort.Direction.DESC, "boardId"
    );
    return boardRepository.findAll(request).getContent();
}
0
marvin ma

Si votre projet utilise Spring-Boot, vous pouvez essayer d'ajouter ces annotations sur votre Application.Java.

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication

public class Application {.....
0
JACK ZOU