Я использую Spring data Rest и ищу способ создать ресурс коллекции (или поиска) с возможностями сортировки и предиката (с использованием querydsl), но без пейджера.
До сих пор мне нужно было только отключить пейджер, но у меня были возможности сортировки. Он хорошо работал, используя следующее и вызывая GET /userAccounts/search/noPager:
public interface ReportRepository
extends JpaRepository<Report, Integer>{
/**
* Non paged data with Sort capabilities
*/
@RestResource(path="noPager")
List<Report> findAllBy(Sort sort);
Теперь мне нужно добавить возможности предиката. Если я сделаю следующее:
public interface UserAccountRepository
extends JpaRepository<UserAccount, Integer>,
QueryDslPredicateExecutor<UserAccount> {
/**
* Non paged data with Sort capabilities
*/
@RestResource(path="noPager")
List<UserAccount> findAllBy(Predicate predicate, Sort sort);
При вызове GET /userAccounts/search/noPager я получаю следующую ошибку:
java.lang.IllegalArgumentException: невозможно определить имена параметров для метода запроса fr.texsys.datemplus.dm.domain.data.UserAccountRepository.findAllBy! Используйте @Param или скомпилируйте с -параметрами в JDK 8. в org.springframework.data.repository.support.ReflectionRepositoryInvoker.prepareParameters (ReflectionRepositoryInvoker.java:235) ~ [spring-data-commons-1.12.3.RELEASE.jar! / : na] в org.springframework.data.repository.support.ReflectionRepositoryInvoker.invokeQueryMethod (ReflectionRepositoryInvoker.java:206) ~ [spring-data-commons-1.12.3.RELEASE.jar! /: na]
Что еще более странно, я попытался использовать QueryDSL с CrudRepository, у которого нет возможностей пейджера. Если я расширяю CrudRepository с помощью QueryDslPredicateExecutor<UserAccount> и вызываю ресурс коллекции GET /userAccounts, активируется пейджер.
Без QueryDslPredicateExecutor:
public interface UserAccountRepository
extends CrudRepository<UserAccount, Integer> {
Нет пейджера:
{
"_embedded" : {
"userAccounts" : [...]
},
"_links" : {
"self" : {
"href" : "http://localhost:15571/userAccounts"
},
"profile" : {
"href" : "http://localhost:15571/profile/userAccounts"
}
}
}
Но с QueryDslPredicateExecutor:
public interface UserAccountRepository
extends CrudRepository<UserAccount, Integer>,
QueryDslPredicateExecutor<UserAccount> {
Пейджер активирован
{
"_embedded" : {
"userAccounts" : [ ... ]
},
"_links" : {
"self" : {
"href" : "http://localhost:15571/userAccounts"
},
"profile" : {
"href" : "http://localhost:15571/profile/userAccounts"
}
},
"page" : {
"size" : 20,
"totalElements" : 3,
"totalPages" : 1,
"number" : 0
}
}