Cóż, przeszukałem Google i znalazłem wiele wyników, ale żaden z nich nie był w stanie odpowiedzieć na mój problem. Tak więc, oto jest.
Próbuję przestudiować Spring MVC i Spring Data JPA, wykonując minimalną implementację klonu pinterest. Tak więc poniżej znajdują się części kodu, które moim zdaniem są istotne dla mojego problemu.
Modele / jednostki
@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...
}
Usługa
@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
}
Magazyn
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
Teraz, gdy wywołuję findLatestBoards
metodę w BoardService
, w wierszu jest zgłaszany wyjątek „Nie znaleziono właściwości” return boardRepository.findAll(request).getContent();
. Oto fragment dziennika Tomcat.
LOG DEBUG
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
Wyjątek
Wyjątkiem jest „ org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
”. Ale, jeśli dobrze zrozumiałem, właściwość board
jest obecna PinItem
i poprawnie odwzorowana za pomocą 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)
Nie rozumiem, dlaczego zgłoszony został ten wyjątek. Masz jakiś pomysł, dlaczego to się dzieje?
Uwaga: używam Hibernate jako dostawcę trwałości. Również część kodu, którą tutaj umieściłem, jest tym, co uważałem za istotne dla problemu. Jeśli tak nie jest, daj mi znać, a zaktualizuję pytanie o wymaganą część.
źródło
Odpowiedzi:
Natknąłem się na ten sam problem i znalazłem rozwiązanie tutaj: https://dzone.com/articles/persistence-layer-spring-data
Zmieniłem nazwę właściwości encji. Jednak w przypadku automatycznych niestandardowych zapytań firmy Springs istniał interfejs zdefiniowany dla starej nazwy właściwości.
Błąd wskazywał, że nie mógł już znaleźć „OldPropName” i zwrócił wyjątek.
Cytując artykuł o DZone:
Kiedy Spring Data tworzy nową implementację repozytorium, analizuje wszystkie metody zdefiniowane przez interfejsy i próbuje automatycznie generować zapytania na podstawie nazwy metody. Chociaż ma to ograniczenia, jest to bardzo skuteczny i elegancki sposób definiowania nowych niestandardowych metod dostępu przy niewielkim wysiłku. Na przykład, jeśli zarządzana encja ma pole nazwy (i standard pobierający i ustawiający w Java Bean dla tego pola), zdefiniowanie metody findByName w interfejsie DAO automatycznie wygeneruje poprawne zapytanie:
To jest stosunkowo prosty przykład; znacznie większy zestaw słów kluczowych jest obsługiwany przez mechanizm tworzenia zapytań.
W przypadku, gdy parser nie może dopasować właściwości do pola obiektu domeny, zgłaszany jest następujący wyjątek:
źródło
Twoje nazewnictwo jest nieprawidłowe .
Zgodnie z dokumentacją , jeśli twoje repozytorium jest
UserBoardRepository
, implementacja twojego niestandardowego repozytorium powinna mieć nazwę, tak jakUserBoardRepositoryImpl
tutaj nazwałeś je jakoBoardServiceImpl
, dlatego zgłasza wyjątek.źródło
BoardServiceImpl
to tylko usługa korzystająca zUserBoardRepository
.Naprawiono, podczas korzystania
CrudRepository
ze Springa musimy poprawnie dodać nazwę właściwości po findBy w przeciwnym razie spowoduje to wyjątek „Nie znaleziono właściwości dla typu”Dostałem ten wyjątek jako. ponieważ nazwa właściwości i nazwa metody nie były zsynchronizowane.
Użyłem poniższego kodu dla DB Access.
a mój użytkownik domeny ma właściwość.
źródło
findStatusId
źlefindByStatusId
poprawny i dla wielu nazw sprawdź stackoverflow.com/a/32796493/944593Ponieważ JPA nazwa repozytorium jest UserBoardRepository , niestandardowe Nazwa interfejsu powinny być UserBoardRepositoryCustom (powinien kończyć się na „Niestandardowy”) oraz implementacji nazwy klasy powinny być UserBoardRepositoryImpl (powinna kończyć IMPL, można ustawić go z innym Postfix pomocą repository- impl-postfix, właściwość)
źródło
ten błąd występuje, jeśli spróbujesz uzyskać dostęp do nieistniejącej właściwości
przypuszczam, że sortowanie odbywa się wiosną,
property name
a nie do końcareal column name
. a błąd wskazuje, że w programie"UserBoard"
nie ma nazwanej właściwości"boardId"
.bests,
Dąb
źródło
A
i klasę,B
która się rozszerzaA
i ma właściwośćx
. Narzekał, że nie może znaleźć nieruchomościx
w klasieA
...W moim przypadku miałem literówkę (sprawa wielbłąda) w mojej nazwie metody. Nazwałem go „findbyLastName” i stanąłem przed tym wyjątkiem. Po zmianie na „findByLastName” wyjątek zniknął.
źródło
Uwaga: odpowiedzi Zane'a XY i Alana B. Dee są całkiem dobre. Jednak dla tych z Was, którzy teraz używaliby Spring Boot i Spring Data, oto odpowiedź, która byłaby bardziej nowoczesna.
Załóżmy, że masz taką klasę jak:
Teraz
JpaRepository
wyglądałoby to jakTeraz twoje „niestandardowe” wyszukiwanie według metody musi być zapisane
Collection<MyClass> findByMyClassName(String myClassName)
dokładnie, ponieważ Spring musi mieć jakiś mechanizm mapowania tej metody naMyClass
właściwośćmyClassName
!Rozgryzłem to, ponieważ wydaje mi się naturalne znalezienie klasy o nazwie semantycznie , podczas gdy w rzeczywistości synatxically ci odnaleźć przez myClassName
Twoje zdrowie
źródło
wygląda na to, że nazwa Twojej niestandardowej metody JpaRepository nie pasuje do żadnej zmiennej w klasach encji. Upewnij się, że nazwa metody pasuje do zmiennej w klasie encji
na przykład: masz nazwę zmiennej o nazwie „active”, a Twoja niestandardowa metoda JpaRepository mówi „findByActiveStatus”, a ponieważ nie ma zmiennej o nazwie „activeStatus”, zgłosi ona „PropertyReferenceException”
źródło
Sprawdź nazwę właściwości w domyślnym wywołaniu repozytorium ei repository.findByUsername (nazwa użytkownika)
źródło
W JPA relacja ma jednego właściciela, a używając
mappedBy
w swojejUserBoard
klasie, możesz powiedzieć, żePinItem
jest właścicielem tej dwukierunkowej relacji i że właściwość wPinItem
relacji jest nazwanaboard
.W swojej
UserBoard
klasie nie masz żadnych pól / właściwości z nazwąboard
, ale ma ona właściwośćpinItemList
, więc możesz spróbować użyć tej właściwości zamiast niej.źródło
Jeśli Twój projekt wykorzystywał Spring-Boot, możesz spróbować dodać te adnotacje w swoim Application.java.
źródło
powinieneś otrzymać stronę użytkowania , taką jak ta
źródło
Powinieneś mieć tę właściwość zdefiniowaną w modelu lub klasie jednostki.
źródło
Miałem podobny problem, który spowodował kilka godzin bólu głowy.
Moja metoda repozytorium to:
Otrzymałem błąd, że typ właściwości nie został znaleziony dla typu ResultClass.
Rozwiązaniem było to, że jpa / hibernate nie obsługuje liczby mnogiej? Niemniej jednak usunięcie „s” rozwiązało problem:
źródło
Miałem ten wyjątek niedawno, kiedy przechodziłem na nowszą wersję Spring-Boot (z 1.5.4 do 1.5.20). Problem dotyczył struktury pakietu repozytorium.
Problem: W ramach tego samego pakietu znajdowały się pakiety: repository, repositoryCustom i repositoryImpl.
Rozwiązanie: Zmień rozmieszczenie pakietów repozytorium tak, aby pakiet repozytorium zawierał repozytorium Pakiet niestandardowy i repozytorium Pakiet niestandardowy zawiera repozytorium Impl:
źródło
Innym scenariuszem, o którym jeszcze nie wspomniano, który spowodował ten błąd, jest API, które odbiera
Pageable
(lubSort
) i przekazuje je w takiej postaci, w jakiej jest, do repozytorium JPA podczas wywoływania API z Swagger.Domyślna wartość Swagger
Pageable
parametru jest następująca:Zwróć uwagę na
"string"
istniejącą właściwość. Uruchomienie API bez jego usunięcia lub zmiany spowodujeorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...
źródło