2017-01-04 21 views
13

Próbuję zaimplementować niestandardowe repozytorium Spring. Mam interfejs:Nie znaleziono właściwości dla niestandardowego repozytorium danych wiosna

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

realizacja:

public class FilterRepositoryImpl implements FilterRepositoryCustom { 
... 
} 

a "głównym" repozytorium, wyciągając moje niestandardowe repozytorium

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

Używam Wiosna Boot, a według do docs:

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

Kiedy uruchomić mojej aplikacji, otrzymuję ten błąd:

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

Odpowiedz

20

Problem polega na tym, że podczas tworzenia FilterRepositoryImpl ale używasz go w UserRepository. Aby to zadziałało, musisz utworzyć UserRepositoryImpl.

Read this doc for more detail

Zasadniczo

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

public class UserRepositoryImpl implements UserRepositoryCustom { 
... 
} 

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

Chociaż zgadzam się, że to działa (i nie widziałem go w akcji), mam ciężko pogodzić ten problem z połączonego dokumentacji, która wyraźnie używa ' CustomizedUserRepositoryImpl' na repozytorium o nazwie 'UserRepository'. Dokumenty idą dalej (przykład 29), aby używać 'HumanRepositoryImpl' i' ContactRepositoryImpl' razem na 'UserRepository'. Wydają się wskazywać, że ważne jest, aby nazwa implementacji fragmentu pasowała do nazwy interfejsu fragmentu, a nie do nazwy repozytorium podstawowego, ale w oczywisty sposób nie wynika to z tego, co widziałem. Jestem zdezorientowany ... –

+3

Zrobiłem jeszcze więcej kopania i odpowiedziałem na moje własne pytanie: wymóg, by nazwa implementacji była oparta na bazie repozytorium, dotyczy tylko starszych (1.x) wersji danych sprężynowych. W wersji 2.x danych sprężynowych to wymaganie się zmienia. W wersji 2.x nazwa pliku musi mieć niestandardową nazwę interfejsu. –

+0

Uratowałeś mi czas i uszczęśliwiłeś mnie! Dzięki, nazywanie za pomocą Spring Data naprawdę maters, event dla testów. –

Powiązane problemy