Я поискал в Google и нашел много результатов, но ни один из них не смог ответить на мою проблему. Итак, вот оно.
Я пытаюсь изучить Spring MVC и Spring Data JPA, выполнив минимальную реализацию клона pinterest. Итак, ниже приведены части кода, которые, на мой взгляд, имеют отношение к моей проблеме.
Модели / Entities
@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
@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
}
вместилище
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
Теперь, когда я вызываю этот findLatestBoards
метод BoardService
, в строке выдается исключение «Свойство не найдено».return boardRepository.findAll(request).getContent();
. Вот выдержка из журнала tomcat.
ЖУРНАЛ ОТЛАДКИ
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
исключение
Исключение составляет " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
". Но, если я правильно понял, свойство board
присутствует PinItem
и правильно отображается 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)
Я не понимаю, почему возникает это исключение. Есть идеи, почему это происходит?
Примечание. Я использую Hibernate в качестве поставщика сохраняемости. Кроме того, фрагмент кода, который я здесь поместил, имеет отношение к проблеме. Если это не так, дайте мне знать, и я обновлю вопрос с необходимой частью.
источник
Ответы:
Я столкнулся с этой же проблемой и нашел решение здесь: https://dzone.com/articles/persistence-layer-spring-data
Я переименовал свойство объекта. Но с автоматическими пользовательскими запросами Springs был определен интерфейс для старого имени свойства.
Ошибка указывает на то, что он больше не может найти "OldPropName", и вызывает исключение.
Процитирую статью о DZone:
Когда Spring Data создает новую реализацию репозитория, он анализирует все методы, определенные интерфейсами, и пытается автоматически сгенерировать запросы из имени метода. Хотя у этого есть ограничения, это очень мощный и элегантный способ определения новых пользовательских методов доступа с минимальными усилиями. Например, если управляемый объект имеет поле имени (и стандартные средства получения и установки Java Bean для этого поля), определение метода findByName в интерфейсе DAO автоматически сгенерирует правильный запрос:
Это относительно простой пример; гораздо больший набор ключевых слов поддерживается механизмом создания запросов.
В случае, если синтаксический анализатор не может сопоставить свойство с полем объекта домена, выдается следующее исключение:
источник
Ваше имя неверно .
Согласно документации , если ваш репозиторий есть
UserBoardRepository
, реализация вашего настраиваемого репозитория должна называтьсяUserBoardRepositoryImpl
, здесь вы назвали его какBoardServiceImpl
, поэтому он выдает исключение.источник
BoardServiceImpl
это просто сервис, использующийUserBoardRepository
.Исправлено: при использовании
CrudRepository
Spring мы должны правильно добавить имя свойства после findBy, иначе будет выдано исключение «Для типа не найдено свойство»Я получал это исключение как. поскольку имя свойства и имя метода не синхронизировались.
Я использовал приведенный ниже код для доступа к БД.
и у моего пользователя домена есть собственность.
источник
findStatusId
неверноfindByStatusId
правильный и для проверки множественного именования stackoverflow.com/a/32796493/944593Поскольку имя вашего репозитория JPA - UserBoardRepository , имя вашего настраиваемого интерфейса должно быть UserBoardRepositoryCustom (оно должно заканчиваться на «Custom»), а имя класса реализации должно быть UserBoardRepositoryImpl (должно заканчиваться на Impl; вы можете установить его с другим постфиксом, используя репозиторий- свойство impl-postfix )
источник
эта ошибка возникает, если вы пытаетесь получить доступ к несуществующему свойству
я предполагаю, что сортировка выполняется по весне,
property name
а не поreal column name
. и ошибка указывает на то,"UserBoard"
что нет свойства с именем"boardId"
.рекорды,
дуб
источник
A
и класс,B
который расширяетсяA
и имеет свойствоx
. Он жаловался, что не может найти недвижимостьx
в классеA
...В моем случае у меня была опечатка (случай верблюда) в имени моего метода. Я назвал его «findbyLastName» и столкнулся с этим исключением. После того, как я изменил его на «findByLastName», исключение исчезло.
источник
Обратите внимание: ответы Зейна XY и Алана Б. Ди вполне хороши. Тем не менее, для тех из вас, кто хотел бы использовать Spring Boot сейчас и Spring Data, вот более современный ответ.
Предположим, у вас есть такой класс, как:
Теперь
JpaRepository
это будет выглядеть такТеперь ваш "пользовательский" метод поиска должен быть написан
Collection<MyClass> findByMyClassName(String myClassName)
точно, потому что Spring должен иметь какой-то механизм для сопоставления этого метода соMyClass
свойствомmyClassName
!Я понял это, потому что мне казалось естественным найти класс по его имени семантически , тогда как на самом деле синатксически вы найдете по myClassName
ура
источник
похоже, что имя вашего пользовательского метода JpaRepository не соответствует ни одной переменной в вашем классе сущности. Убедитесь, что имя вашего метода соответствует переменной в вашем классе сущности
например: у вас есть имя переменной с именем «active», а в вашем пользовательском методе JpaRepository указано «findByActiveStatus», и поскольку нет переменной с именем «activeStatus», он выдаст «PropertyReferenceException»
источник
Проверьте имя свойства в вызове по умолчанию репозитория ei. FindByUsername (имя пользователя)
источник
В JPA отношение имеет одного владельца, и, используя
mappedBy
в своемUserBoard
классе, вы сообщаете, чтоPinItem
это владелец этого двунаправленного отношения, и что свойство вPinItem
связи называетсяboard
.В вашем
UserBoard
классе нет полей / свойств с именемboard
, но у него есть свойствоpinItemList
, поэтому вы можете попробовать использовать это свойство вместо этого.источник
Если в вашем проекте используется Spring-Boot, вы можете попробовать добавить эти аннотации в свой Application.java.
источник
вы должны получить страницу использования , как это
источник
Это свойство должно быть определено в вашей модели или классе сущности.
источник
У меня была похожая проблема, из-за которой у меня несколько часов болела голова.
Мой метод репозитория был:
Я получил сообщение об ошибке, что тип свойства не найден для типа ResultClass.
Решение заключалось в том, что jpa / hibernate не поддерживает множественное число? Тем не менее, удаление 's' решило проблему:
источник
Недавно у меня было это исключение при переходе на более новую версию с весенней загрузкой (с 1.5.4 до 1.5.20). Проблема была в структуре пакета репозитория.
Проблема: В одном пакете находились пакеты: repository, repositoryCustom и repositoryImpl.
Решение: измените порядок пакетов репозитория так, чтобы пакет репозитория содержал репозиторий Пользовательский пакет и репозиторий Пользовательский пакет содержал репозиторийImpl:
источник
Другой сценарий, который здесь еще не упоминался, который вызвал эту ошибку, - это API, который получает
Pageable
(илиSort
) и передает его, как есть, в репозиторий JPA при вызове API из Swagger.Значение Swagger по умолчанию для
Pageable
параметра следующее:Обратите внимание на
"string"
то, что свойство действительно существует. Запуск API без его удаления или изменения приведет кorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...
источник