2017-01-04 4 views
13

Я пытаюсь реализовать собственный репозиторий Spring. У меня есть интерфейс:Не найдено свойства для типа ... custom Spring Data repository

public interface FilterRepositoryCustom { 
    List<User> filterBy(String role); 
} 

реализация:

public class FilterRepositoryImpl implements FilterRepositoryCustom { 
... 
} 

и "главное" хранилище, расширяя свой собственный репозиторий:

public interface UserRepository extends JpaRepository<User, String>, FilterRepositoryCustom { 
... 
} 

Я использую Spring бутс и, согласно до docs:

By default, Spring Boot will enable JPA repository support and look in the package (and its subpackages) where @SpringBootApplication is located.

Когда я запускаю мое приложение, я получаю эту ошибку:

org.springframework.data.mapping.PropertyReferenceException: No property filterBy found for type User!

ответ

20

Проблема здесь состоит в том, что вы создаете FilterRepositoryImpl но вы используете его в UserRepository. Вам необходимо создать UserRepositoryImpl, чтобы сделать эту работу.

Read this doc for more detail

В основном

public interface UserRepositoryCustom { 
    List<User> filterBy(String role); 
} 

public class UserRepositoryImpl implements UserRepositoryCustom { 
... 
} 

public interface UserRepository extends JpaRepository<User, String>, UserRepositoryCustom { 
... 
} 
+2

Хотя я согласен, что это работает (и видел его в действии), я с трудом примирил такое поведение со связанной документации, которая явно использует ' CustomizedUserRepositoryImpl' в репозитории с именем 'UserRepository'. Затем документы далее идут (пример 29), чтобы использовать 'HumanRepositoryImpl' AND' ContactRepositoryImpl' вместе в 'UserRepository'. Они, по-видимому, указывают, что важно, чтобы имя реализации фрагмента соответствовало имени интерфейса фрагмента, а не имени базового репозитория, но это явно не так, как я видел. Я запутался ... –

+3

Сделал еще несколько копаний и ответил на мой собственный вопрос: требование о том, чтобы имя реализации было основано на имени базового репозитория, справедливо только для старых (1.x) версий весенних данных. В версии 2.x весенних данных это требование меняется. В 2.x имя impl должно следовать имени пользовательского интерфейса. –

+0

Вы спасли мое время и сделали меня счастливым! Спасибо, назвав Spring Data действительно матчи, событие для тестов. –

0

Это ошибка JPA является означает, что ваше предприятие не имеет свойства «filterBy». Ваш метод нужно будет называть чем-то вроде findByRole (роль строки), где «роль» является свойством.

См https://docs.spring.io/spring-data/jpa/docs/current/reference/html/