Nun, ich habe Google durchsucht und viele Ergebnisse gefunden, aber keines von ihnen konnte mein Problem beantworten. Also, hier geht es.
Ich versuche, Spring MVC und Spring Data JPA zu studieren, indem ich eine minimale Implementierung des pinterest-Klons durchführe. Im Folgenden sind die Teile des Codes aufgeführt, die meiner Meinung nach für mein Problem relevant sind.
Modelle / Entitäten
@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...
}
Bedienung
@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
}
Repository
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
Wenn ich jetzt die findLatestBoards
Methode BoardService
aufrufe, wird die Ausnahme "Keine Eigenschaft gefunden" in der Zeile ausgelöst return boardRepository.findAll(request).getContent();
. Hier ist der Auszug aus dem Tomcat-Protokoll.
AUSTESTUNGSPROTOKOLL
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
Ausnahme
Die Ausnahme ist " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
". Aber wenn ich es richtig verstanden habe, ist die Eigenschaft board
in vorhanden PinItem
und wird korrekt mit mappedBy = "board"
in zugeordnet 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)
Ich verstehe nicht, warum diese Ausnahme ausgelöst wird. Irgendeine Idee, warum es passiert?
Hinweis: Ich verwende den Ruhezustand als Persistenzanbieter. Der Code-Teil, den ich hier eingefügt habe, ist meiner Meinung nach für das Problem relevant. Wenn dies nicht der Fall ist, lassen Sie es mich wissen und ich werde die Frage mit dem erforderlichen Teil aktualisieren.
quelle
Antworten:
Ich bin auf dasselbe Problem gestoßen und habe die Lösung hier gefunden: https://dzone.com/articles/persistence-layer-spring-data
Ich hatte eine Entitätseigenschaft umbenannt. Bei Springs Automatic Custom Queries wurde jedoch eine Schnittstelle für den alten Eigenschaftsnamen definiert.
Der Fehler zeigte an, dass "OldPropName" nicht mehr gefunden werden konnte, und löste die Ausnahme aus.
Um den Artikel über DZone zu zitieren:
Wenn Spring Data eine neue Repository-Implementierung erstellt, analysiert es alle von den Schnittstellen definierten Methoden und versucht, automatisch Abfragen aus dem Methodennamen zu generieren. Dies hat zwar Einschränkungen, ist jedoch eine sehr leistungsstarke und elegante Möglichkeit, neue benutzerdefinierte Zugriffsmethoden mit sehr geringem Aufwand zu definieren. Wenn die verwaltete Entität beispielsweise über ein Namensfeld verfügt (und den Java Bean-Standard-Getter und -Setter für dieses Feld), wird beim Definieren der findByName-Methode in der DAO-Schnittstelle automatisch die richtige Abfrage generiert:
Dies ist ein relativ einfaches Beispiel. Ein viel größerer Satz von Schlüsselwörtern wird vom Mechanismus zur Erstellung von Abfragen unterstützt.
Für den Fall, dass der Parser die Eigenschaft nicht mit dem Domänenobjektfeld abgleichen kann, wird die folgende Ausnahme ausgelöst:
quelle
Ihre Benennung ist nicht korrekt .
Gemäß der Dokumentation , wenn Ihr Repository ist
UserBoardRepository
, sollte die Implementierung des benutzerdefinierten Repository sein Name wieUserBoardRepositoryImpl
, hier können Sie es als NamenBoardServiceImpl
, deshalb ist es die Ausnahme auslöst.quelle
BoardServiceImpl
ist nur ein Dienst mit demUserBoardRepository
.Behoben: Während der Verwendung
CrudRepository
von Spring müssen wir den Eigenschaftsnamen nach findBy korrekt anhängen, da sonst die Ausnahme "Keine Eigenschaft für Typ gefunden" angezeigt wird.Ich bekam diese Ausnahme als. weil Eigenschaftsname und Methodenname nicht synchron waren.
Ich habe den folgenden Code für DB Access verwendet.
und mein Domain-Benutzer hat Eigentum.
quelle
findStatusId
falschfindByStatusId
richtig und für mehrere Namen überprüfen stackoverflow.com/a/32796493/944593Da Ihr JPA-Repository-Name UserBoardRepository lautet , sollte Ihr benutzerdefinierter Schnittstellenname UserBoardRepositoryCustom (er sollte mit 'Custom' enden) und Ihr Implementierungsklassenname UserBoardRepositoryImpl (sollte mit Impl enden; Sie können ihn mit einem anderen Postfix über das Repository festlegen) festlegen. impl-postfix- Eigenschaft)
quelle
Dieser Fehler tritt auf, wenn Sie versuchen, auf nicht vorhandene Eigenschaften zuzugreifen
Ich vermute, dass das Sortieren im Frühjahr nach
property name
und nicht nach erfolgtreal column name
. und der Fehler zeigt an, dass"UserBoard"
keine Eigenschaft benannt ist"boardId"
.Bests,
Eiche
quelle
A
und eine KlasseB
, die sich erweitertA
und eine Eigenschaft hatx
. Es beschwerte sich, dass es keine Immobiliex
in der Klasse finden konnteA
...In meinem Fall hatte ich einen Tippfehler (Kamelfall) in meinem Methodennamen. Ich nannte es "findbyLastName" und sah mich dieser Ausnahme gegenüber. Nachdem ich es in "findByLastName" geändert hatte, war die Ausnahme weg.
quelle
Beachten Sie hier: Die Antworten von Zane XY und Alan B. Dee sind ziemlich gut. Für diejenigen unter Ihnen, die Spring Boot und Spring Data jetzt verwenden würden, ist hier eine modernere Antwort.
Angenommen, Sie haben eine Klasse wie:
Nun würde ein
JpaRepository
dafür aussehenJetzt muss Ihre "benutzerdefinierte" Methode nach Methode
Collection<MyClass> findByMyClassName(String myClassName)
genau geschrieben werden , da Spring über einen Mechanismus verfügen muss, um diese Methode auf eineMyClass
Eigenschaft abzubildenmyClassName
!Ich dachte , dies aus , weil ich, ist es natürlich schien eine Klasse durch ihren Namen zu finden semantisch , während in der Tat, synatxically Sie von MyClassName finden
Prost
quelle
Es sieht so aus, als ob der Name Ihrer benutzerdefinierten JpaRepository-Methode keiner Variablen in Ihren Entitätsklassen entspricht. Stellen Sie sicher, dass Ihr Methodenname mit einer Variablen in Ihrer Entitätsklasse übereinstimmt
Beispiel: Sie haben einen Variablennamen mit dem Namen "active" und Ihre benutzerdefinierte JpaRepository-Methode sagt "findByActiveStatus". Da es keine Variable mit dem Namen "activeStatus" gibt, wird "PropertyReferenceException" ausgelöst.
quelle
Bitte überprüfen Sie den Eigenschaftsnamen im defualt-Aufruf von repo ei repository.findByUsername (Benutzername).
quelle
In JPA hat eine Beziehung einen einzelnen Eigentümer. Wenn Sie
mappedBy
in IhrerUserBoard
Klasse verwenden, erkennen Sie, dass diesPinItem
der Eigentümer dieser bidirektionalen Beziehung ist und dass die Eigenschaft inPinItem
der Beziehung benannt istboard
.In Ihrer
UserBoard
Klasse haben Sie keine Felder / Eigenschaften mit dem Namenboard
, aber eine EigenschaftpinItemList
. Sie können daher versuchen, diese Eigenschaft stattdessen zu verwenden.quelle
Wenn Ihr Projekt Spring-Boot verwendet hat, können Sie versuchen, diese Anmerkungen in Ihrer Application.java hinzuzufügen.
quelle
Sie sollten eine Nutzungsseite , wie diese erhalten
quelle
Diese Eigenschaft sollte in Ihrem Modell oder Ihrer Entitätsklasse definiert sein.
quelle
Ich hatte ein ähnliches Problem, das mir einige Stunden Kopfschmerzen bereitete.
Meine Repository-Methode war:
Ich habe den Fehler erhalten, dass der Eigenschaftstyp für den Typ ResultClass nicht gefunden wurde.
Die Lösung war, dass jpa / hibernate keine Pluralformen unterstützt? Trotzdem löste das Entfernen der 's' das Problem:
quelle
Ich hatte diese Ausnahme kürzlich beim Wechsel zu einer neueren Spring-Boot-Version (von 1.5.4 auf 1.5.20). Das Problem lag in der Repository-Paketstruktur.
Problem: Unter demselben Paket befanden sich die Pakete: repository, repositoryCustom und repositoryImpl.
Lösung: Ordnen Sie die Repository-Pakete neu an, sodass das Repository-Paket das repositoryCustom-Paket und das repositoryCustom-Paket repositoryImpl enthält:
quelle
Ein anderes Szenario, das hier noch nicht erwähnt wurde und diesen Fehler verursacht hat, ist eine API, die es empfängt
Pageable
(oderSort
) und es so wie es ist an das JPA-Repository übergibt, wenn die API von Swagger aufgerufen wird.Der Swagger-Standardwert für den
Pageable
Parameter lautet:Beachten Sie das
"string"
dort, was eine Eigenschaft ist, die existiert. Das Ausführen der API ohne Löschen oder Ändern führt dazuorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...
quelle