Spring Data JPA - исключение «Свойство для типа не найдено»

127

Я поискал в 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 в качестве поставщика сохраняемости. Кроме того, фрагмент кода, который я здесь поместил, имеет отношение к проблеме. Если это не так, дайте мне знать, и я обновлю вопрос с необходимой частью.

Jomoos
источник
2
Я столкнулся с той же проблемой, когда назвал встроенный идентификатор MyCompositePK и попытался написать findByMyCompositePKUserId (Long userId) . Дело в том, что он должен быть верблюжьим случаем также и для репозитория CRUD, чтобы различать свойства таблицы при создании запроса из вашего метода. Итак, это должны быть MyCompositePk и findByMyCompositePkUserId (Long userId)
EmeraldTablet

Ответы:

138

Я столкнулся с этой же проблемой и нашел решение здесь: https://dzone.com/articles/persistence-layer-spring-data

Я переименовал свойство объекта. Но с автоматическими пользовательскими запросами Springs был определен интерфейс для старого имени свойства.

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

Ошибка указывает на то, что он больше не может найти "OldPropName", и вызывает исключение.

Процитирую статью о DZone:

Когда Spring Data создает новую реализацию репозитория, он анализирует все методы, определенные интерфейсами, и пытается автоматически сгенерировать запросы из имени метода. Хотя у этого есть ограничения, это очень мощный и элегантный способ определения новых пользовательских методов доступа с минимальными усилиями. Например, если управляемый объект имеет поле имени (и стандартные средства получения и установки Java Bean для этого поля), определение метода findByName в интерфейсе DAO автоматически сгенерирует правильный запрос:

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

Это относительно простой пример; гораздо больший набор ключевых слов поддерживается механизмом создания запросов.

В случае, если синтаксический анализатор не может сопоставить свойство с полем объекта домена, выдается следующее исключение:

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo
Алан Б. Ди
источник
86

Ваше имя неверно .

Согласно документации , если ваш репозиторий есть UserBoardRepository, реализация вашего настраиваемого репозитория должна называться UserBoardRepositoryImpl, здесь вы назвали его как BoardServiceImpl, поэтому он выдает исключение.

Зейн XY
источник
1
Кроме того, все классы / интерфейсы репозитория должны быть помещены в один каталог - насколько мне известно
Блавей Коцик
6
Я не знаю, почему за это так много голосов, но в этом вопросе нет специального репозитория. BoardServiceImplэто просто сервис, использующий UserBoardRepository.
Дидье Л.
это мой случай! У меня не было проблем до того, как я перенес классы Impl в совершенно другой пакет, но потом это произошло. Спасибо
Buckstabue
Это спасло мне день!
letimome
48

Исправлено: при использовании CrudRepositorySpring мы должны правильно добавить имя свойства после findBy, иначе будет выдано исключение «Для типа не найдено свойство»

Я получал это исключение как. поскольку имя свойства и имя метода не синхронизировались.

Я использовал приведенный ниже код для доступа к БД.

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

и у моего пользователя домена есть собственность.

@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;
Кумар Абхишек
источник
1
Этот подход мне помог - я использовал неправильное имя свойства моего класса в методе репозитория 'default' (предоставляемом интерфейсом CrudRepository) (т.е. я использовал findByDateOfStatisticsBetween (), я использовал именование метода findByDateBetween ())
ryzhman
1
пример findStatusIdневерно findByStatusIdправильный и для проверки множественного именования stackoverflow.com/a/32796493/944593
shareef
Сэкономил кучу времени для меня. Спасибо :).
Joey587 03
27

Поскольку имя вашего репозитория JPA - UserBoardRepository , имя вашего настраиваемого интерфейса должно быть UserBoardRepositoryCustom (оно должно заканчиваться на «Custom»), а имя класса реализации должно быть UserBoardRepositoryImpl (должно заканчиваться на Impl; вы можете установить его с другим постфиксом, используя репозиторий- свойство impl-postfix )

Abhilash
источник
17

эта ошибка возникает, если вы пытаетесь получить доступ к несуществующему свойству

я предполагаю, что сортировка выполняется по весне, property nameа не по real column name. и ошибка указывает на то, "UserBoard"что нет свойства с именем"boardId" .

рекорды,

дуб

дуб
источник
Спасибо. Мне потребовалось время, чтобы найти это решение, потому что Spring жаловался на что-то совершенно другое. У меня есть класс Aи класс, Bкоторый расширяется Aи имеет свойство x. Он жаловался, что не может найти недвижимость xв классе A...
GuiRitter
9

В моем случае у меня была опечатка (случай верблюда) в имени моего метода. Я назвал его «findbyLastName» и столкнулся с этим исключением. После того, как я изменил его на «findByLastName», исключение исчезло.

horizon7
источник
1
Примечание для себя: дважды проверьте! :-)
lilalinux
8

Обратите внимание: ответы Зейна XY и Алана Б. Ди вполне хороши. Тем не менее, для тех из вас, кто хотел бы использовать Spring Boot сейчас и Spring Data, вот более современный ответ.

Предположим, у вас есть такой класс, как:

@Entity
class MyClass {
    @Id
    @GeneratedValue
    private Long id;

    private String myClassName;
}

Теперь JpaRepositoryэто будет выглядеть так

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

Теперь ваш "пользовательский" метод поиска должен быть написан Collection<MyClass> findByMyClassName(String myClassName)точно, потому что Spring должен иметь какой-то механизм для сопоставления этого метода со MyClassсвойством myClassName!

Я понял это, потому что мне казалось естественным найти класс по его имени семантически , тогда как на самом деле синатксически вы найдете по myClassName

ура

avi.elkharrat
источник
2

похоже, что имя вашего пользовательского метода JpaRepository не соответствует ни одной переменной в вашем классе сущности. Убедитесь, что имя вашего метода соответствует переменной в вашем классе сущности

например: у вас есть имя переменной с именем «active», а в вашем пользовательском методе JpaRepository указано «findByActiveStatus», и поскольку нет переменной с именем «activeStatus», он выдаст «PropertyReferenceException»

bubingaa
источник
1

Проверьте имя свойства в вызове по умолчанию репозитория ei. FindByUsername (имя пользователя)

Шахид Хуссейн Аббаси
источник
0

В JPA отношение имеет одного владельца, и, используя mappedByв своем UserBoardклассе, вы сообщаете, что PinItemэто владелец этого двунаправленного отношения, и что свойство в PinItemсвязи называетсяboard .

В вашем UserBoardклассе нет полей / свойств с именем board, но у него есть свойство pinItemList, поэтому вы можете попробовать использовать это свойство вместо этого.

Андрей I
источник
0

Если в вашем проекте используется Spring-Boot, вы можете попробовать добавить эти аннотации в свой Application.java.

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)
@SpringBootApplication

public class Application {.....
ДЖЕК ЗОУ
источник
0

вы должны получить страницу использования , как это

 @Override
public Page<UserBoard> findLatestBoards() {
    PageRequest request = new PageRequest(
                 0, PresentationUtil.PAGE_SIZE, 
                 Sort.Direction.DESC, "boardId"
    );
    return boardRepository.findAll(request).getContent();
}
Марвин Ма
источник
0

Это свойство должно быть определено в вашей модели или классе сущности.

Дила Гурунг
источник
0

У меня была похожая проблема, из-за которой у меня несколько часов болела голова.

Мой метод репозитория был:

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

Я получил сообщение об ошибке, что тип свойства не найден для типа ResultClass.

Решение заключалось в том, что jpa / hibernate не поддерживает множественное число? Тем не менее, удаление 's' решило проблему:

public List<ResultClass> findAllByTypeAndObject(String type, List<Object>
mirisbowring
источник
Извините, что вы удалили? Эти две строчки выглядят одинаково
Раймонд Чен,
@ user7344209 Я исправил эту ошибку. См. Название метода во втором примере кода.
mirisbowring
Даже для названия сущности Objects?
P Satish Patro,
0

Недавно у меня было это исключение при переходе на более новую версию с весенней загрузкой (с 1.5.4 до 1.5.20). Проблема была в структуре пакета репозитория.

Проблема: В одном пакете находились пакеты: repository, repositoryCustom и repositoryImpl.

Решение: измените порядок пакетов репозитория так, чтобы пакет репозитория содержал репозиторий Пользовательский пакет и репозиторий Пользовательский пакет содержал репозиторийImpl:

хранилище 
   |
   ----- репозиторий
             |
             ----- репозиторийImpl
ognjenkl
источник
0

Другой сценарий, который здесь еще не упоминался, который вызвал эту ошибку, - это API, который получает Pageable(или Sort) и передает его, как есть, в репозиторий JPA при вызове API из Swagger.

Значение Swagger по умолчанию для Pageableпараметра следующее:

  {
    "page": 0,
    "size": 0,
    "sort": [
      "string"
    ]
  }

Обратите внимание на "string"то, что свойство действительно существует. Запуск API без его удаления или изменения приведет кorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...

selalerer
источник