我需要覆盖spring data提供的Pageable类,然后覆盖SimpleNeo4jRepository提供的findAll方法。
但是在这样做的时候,我在服务器启动Caused by: java.lang.IllegalArgumentException: Paging query needs to have a Pageable parameter! Offending method public abstract com.app.backend.repository.pagination.AppPage com.app.backend.repository.BaseRepository.findAll(com.app.backend.repository.pagination.AppPageRequest)     at org.springframework.util.Assert.isTrue(Assert.java:116) ~[spring-core-5.0.8.RELEASE.jar:5.0.8.RELEASE]     at org.springframework.data.repository.query.QueryMethod.<init>(QueryMethod.java:99) ~[spring-data-commons-2.0.9.RELEASE.jar:2.0.9.RELEASE]     at org.springframework.data.neo4j.repository.query.GraphQueryMethod.<init>(GraphQueryMethod.java:41) ~[spring-data-neo4j-5.0.9.RELEASE.jar:5.0.9.RELEASE]     at org.springframework.data.neo4j.repository.query.GraphQueryLookupStrategy.resolveQuery(GraphQueryLookupStrategy.java:49) ~[spring-data-neo4j-5.0.9.RELEASE.jar:5.0.9.RELEASE]时收到一个错误
以下是代码
public class AppPageRequest extends PageRequest implements Pageable {
  private AppPageRequest(int page, int size, Sort sort) {
    super(page - 1, size, sort);
  }
  public static AppPageRequest of(int page, int size) {
    return of(page, size, Sort.unsorted());
  }
  public static AppPageRequest of(int page, int size, Sort sort) {
    return new AppPageRequest(page, size, sort);
  }
}
@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends Neo4jRepository<T, ID> {
  Page<T> findAll(AppPageRequest appPageRequest);
}
@NoRepositoryBean
public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleNeo4jRepository<T, ID> implements BaseRepository<T, ID> {
  public BaseRepositoryImpl(Class<T> domainClass, Session session) {
    super(domainClass, session);
  }
  public Page<T> findAll(AppPageRequest appPageRequest) {
    return super.findAll(appPageRequest);
  }
}发布于 2018-08-28 18:05:05
假设您希望确保没有人能够调用findAll并与Pageable的默认实现相关,那么您必须注意两件事:
findAll扩展您的BaseRepository来覆盖Neo4jRepository和相关的签名,这些方法不会被覆盖,而是会被重载,并且可以像以前一样被调用。所述
考虑到这一点,这里有一个适合我们的解决方案。使用Spring Boot2.0.4、Spring Data Kay和OGM3.1.0进行测试,运行在Java10上。在这个Gist中可以找到完整的解决方案。
关键点:
最大扩展Spring Datas CrudRepository:
@NoRepositoryBean
interface BaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
    Page<T> findAll(AppPageRequest appPageRequest);
}CrudRepository不包含findAll,因此您的用户无法使用它。保持您的BaseRepositoryImpl为原样(参见要点)。
让您的域存储库扩展BaseRepository,而不是Neo4jRepository:
interface ThingRepository extends BaseRepository<ThingEntity, Long> {
}然后,重要的一步是通过@EnableNeo4jRepositories使SDN知道新的基础实现
@SpringBootApplication
@EnableNeo4jRepositories(repositoryBaseClass = BaseRepositoryImpl.class)
public class CustomPagerequestApplication {
    public static void main(String[] args) {
        SpringApplication.run(CustomPagerequestApplication.class, args);
    }
}然后你可以像这样使用你的repo:
@Component
class ExampleUsage implements CommandLineRunner {
    private final ThingRepository thingRepository;
    public ExampleUsage(ThingRepository thingRepository) {
        this.thingRepository = thingRepository;
    }
    @Override
    public void run(String... args) {
        var things = IntStream.iterate(1, i -> i <= 10, i -> i + 1)
            .mapToObj(ThingEntity::new)
            .collect(toList());
        this.thingRepository.saveAll(things);
        var page = this.thingRepository.findAll(AppPageRequest.of(1, 5));
        page.stream().map(ThingEntity::getName).forEach(System.out::println);
    }
}如果这有帮助,请让我知道。同样,这里有指向完整示例的链接:Enforce a concrete implementation of Pageable for paged Queries with Spring Data (Neo4j)
发布于 2018-08-31 02:28:34
这是一个配置错误。提到BaseRepositoryImpl作为存储库基类解决了这个问题。
我变了
@EnableNeo4jRepositories至
@EnableNeo4jRepositories(repositoryBaseClass = BaseRepositoryImpl.class)https://stackoverflow.com/questions/51855262
复制相似问题