From 0c5379607d377b93650740b7ae0cfeaee02fff15 Mon Sep 17 00:00:00 2001 From: Moritz Becker Date: Thu, 9 May 2019 12:25:36 +0200 Subject: [PATCH] [#795] fix offset parameter in spring data rest integration --- .../impl/query/CriteriaQueryParameterBinder.java | 9 ++++++++- .../impl/query/PartTreeBlazePersistenceQuery.java | 7 ++++++- .../repository/EntityViewAwareRepositoryImpl.java | 7 ++++++- .../impl/query/CriteriaQueryParameterBinder.java | 9 ++++++++- .../impl/query/PartTreeBlazePersistenceQuery.java | 7 ++++++- .../repository/EntityViewAwareRepositoryImpl.java | 7 ++++++- .../impl/query/CriteriaQueryParameterBinder.java | 9 ++++++++- .../impl/query/PartTreeBlazePersistenceQuery.java | 7 ++++++- .../repository/EntityViewAwareRepositoryImpl.java | 7 ++++++- .../spring/data/repository/KeysetPageRequest.java | 2 +- ...KeysetPageableHandlerMethodArgumentResolver.java | 2 +- .../data/testsuite/DocumentControllerTest.java | 13 +++++++++++++ 12 files changed, 75 insertions(+), 11 deletions(-) diff --git a/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java b/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java index a0ada22c64..bee3b9e7dd 100644 --- a/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java +++ b/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java @@ -19,6 +19,8 @@ import com.blazebit.persistence.spring.data.base.query.AbstractCriteriaQueryParameterBinder; import com.blazebit.persistence.spring.data.base.query.JpaParameters; import com.blazebit.persistence.spring.data.base.query.ParameterMetadataProvider; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; +import org.springframework.data.domain.Pageable; /** * Concrete version for Spring Data 1.x. @@ -34,6 +36,11 @@ public CriteriaQueryParameterBinder(JpaParameters parameters, Object[] values, I @Override protected int getOffset() { - return getPageable().getOffset(); + Pageable pageable = getPageable(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return pageable.getOffset(); + } } } diff --git a/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java b/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java index b8ca9734b6..d7039adb2f 100644 --- a/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java +++ b/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java @@ -22,6 +22,7 @@ import com.blazebit.persistence.spring.data.base.query.JpaParameters; import com.blazebit.persistence.spring.data.base.query.ParameterBinder; import com.blazebit.persistence.spring.data.base.query.ParameterMetadataProvider; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; import com.blazebit.persistence.view.EntityViewManager; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.provider.PersistenceProvider; @@ -62,7 +63,11 @@ protected int getOffset(Pageable pageable) { if (pageable == null) { return 0; } - return pageable.getOffset(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return pageable.getOffset(); + } } @Override diff --git a/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java b/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java index 743b9d0fce..5caf81470f 100644 --- a/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java +++ b/integration/spring-data/1.x/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java @@ -20,6 +20,7 @@ import com.blazebit.persistence.spring.data.base.repository.AbstractEntityViewAwareRepository; import com.blazebit.persistence.spring.data.repository.EntityViewRepository; import com.blazebit.persistence.spring.data.repository.EntityViewSpecificationExecutor; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; import com.blazebit.persistence.view.EntityViewManager; import org.springframework.data.domain.Example; import org.springframework.data.domain.Pageable; @@ -66,6 +67,10 @@ public E findById(ID id) { @Override protected int getOffset(Pageable pageable) { - return pageable.getOffset(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return pageable.getOffset(); + } } } diff --git a/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java b/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java index 2f459faa50..af63b78945 100644 --- a/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java +++ b/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java @@ -19,6 +19,8 @@ import com.blazebit.persistence.spring.data.base.query.AbstractCriteriaQueryParameterBinder; import com.blazebit.persistence.spring.data.base.query.JpaParameters; import com.blazebit.persistence.spring.data.base.query.ParameterMetadataProvider; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; +import org.springframework.data.domain.Pageable; /** * Concrete version for Spring Data 2.x. @@ -34,6 +36,11 @@ public CriteriaQueryParameterBinder(JpaParameters parameters, Object[] values, I @Override protected int getOffset() { - return (int) getPageable().getOffset(); + Pageable pageable = getPageable(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return (int) pageable.getOffset(); + } } } diff --git a/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java b/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java index ddc0efa345..5d2695f4cc 100644 --- a/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java +++ b/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java @@ -22,6 +22,7 @@ import com.blazebit.persistence.spring.data.base.query.JpaParameters; import com.blazebit.persistence.spring.data.base.query.ParameterBinder; import com.blazebit.persistence.spring.data.base.query.ParameterMetadataProvider; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; import com.blazebit.persistence.view.EntityViewManager; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.provider.PersistenceProvider; @@ -60,7 +61,11 @@ protected boolean isExists(PartTree tree) { @Override protected int getOffset(Pageable pageable) { if (pageable.isPaged()) { - return (int) pageable.getOffset(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return (int) pageable.getOffset(); + } } return 0; } diff --git a/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java b/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java index 2fa610ead2..34fee38582 100644 --- a/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java +++ b/integration/spring-data/2.0/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java @@ -19,6 +19,7 @@ import com.blazebit.persistence.CriteriaBuilderFactory; import com.blazebit.persistence.spring.data.base.repository.AbstractEntityViewAwareRepository; import com.blazebit.persistence.spring.data.repository.EntityViewRepository; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; import com.blazebit.persistence.view.EntityViewManager; import com.infradna.tool.bridge_method_injector.WithBridgeMethods; import org.springframework.data.domain.Example; @@ -73,6 +74,10 @@ private Object convert(Optional optional, Class targetType) { @Override protected int getOffset(Pageable pageable) { - return (int) pageable.getOffset(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return (int) pageable.getOffset(); + } } } diff --git a/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java b/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java index 2f459faa50..af63b78945 100644 --- a/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java +++ b/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/CriteriaQueryParameterBinder.java @@ -19,6 +19,8 @@ import com.blazebit.persistence.spring.data.base.query.AbstractCriteriaQueryParameterBinder; import com.blazebit.persistence.spring.data.base.query.JpaParameters; import com.blazebit.persistence.spring.data.base.query.ParameterMetadataProvider; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; +import org.springframework.data.domain.Pageable; /** * Concrete version for Spring Data 2.x. @@ -34,6 +36,11 @@ public CriteriaQueryParameterBinder(JpaParameters parameters, Object[] values, I @Override protected int getOffset() { - return (int) getPageable().getOffset(); + Pageable pageable = getPageable(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return (int) pageable.getOffset(); + } } } diff --git a/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java b/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java index ddc0efa345..5d2695f4cc 100644 --- a/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java +++ b/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/query/PartTreeBlazePersistenceQuery.java @@ -22,6 +22,7 @@ import com.blazebit.persistence.spring.data.base.query.JpaParameters; import com.blazebit.persistence.spring.data.base.query.ParameterBinder; import com.blazebit.persistence.spring.data.base.query.ParameterMetadataProvider; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; import com.blazebit.persistence.view.EntityViewManager; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.provider.PersistenceProvider; @@ -60,7 +61,11 @@ protected boolean isExists(PartTree tree) { @Override protected int getOffset(Pageable pageable) { if (pageable.isPaged()) { - return (int) pageable.getOffset(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return (int) pageable.getOffset(); + } } return 0; } diff --git a/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java b/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java index 3f36ede4f8..167c4bc3fd 100644 --- a/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java +++ b/integration/spring-data/2.1/src/main/java/com/blazebit/persistence/spring/data/impl/repository/EntityViewAwareRepositoryImpl.java @@ -19,6 +19,7 @@ import com.blazebit.persistence.CriteriaBuilderFactory; import com.blazebit.persistence.spring.data.base.repository.AbstractEntityViewAwareRepository; import com.blazebit.persistence.spring.data.repository.EntityViewRepository; +import com.blazebit.persistence.spring.data.repository.KeysetPageable; import com.blazebit.persistence.view.EntityViewManager; import com.infradna.tool.bridge_method_injector.WithBridgeMethods; import org.springframework.data.domain.Example; @@ -83,6 +84,10 @@ public void setRepositoryMethodMetadata(CrudMethodMetadata crudMethodMetadata) { @Override protected int getOffset(Pageable pageable) { - return (int) pageable.getOffset(); + if (pageable instanceof KeysetPageable) { + return ((KeysetPageable) pageable).getIntOffset(); + } else { + return (int) pageable.getOffset(); + } } } diff --git a/integration/spring-data/base/src/main/java/com/blazebit/persistence/spring/data/repository/KeysetPageRequest.java b/integration/spring-data/base/src/main/java/com/blazebit/persistence/spring/data/repository/KeysetPageRequest.java index 76ac712268..064758a807 100644 --- a/integration/spring-data/base/src/main/java/com/blazebit/persistence/spring/data/repository/KeysetPageRequest.java +++ b/integration/spring-data/base/src/main/java/com/blazebit/persistence/spring/data/repository/KeysetPageRequest.java @@ -87,7 +87,7 @@ public KeysetPageRequest(KeysetPage keysetPage, Sort sort, int offset, int pageS @Override public int getIntOffset() { - return offset; + return (int) offset; } @Override diff --git a/integration/spring-data/rest/src/main/java/com/blazebit/persistence/spring/data/rest/impl/KeysetPageableHandlerMethodArgumentResolver.java b/integration/spring-data/rest/src/main/java/com/blazebit/persistence/spring/data/rest/impl/KeysetPageableHandlerMethodArgumentResolver.java index 5461b21e5e..071c8c0963 100644 --- a/integration/spring-data/rest/src/main/java/com/blazebit/persistence/spring/data/rest/impl/KeysetPageableHandlerMethodArgumentResolver.java +++ b/integration/spring-data/rest/src/main/java/com/blazebit/persistence/spring/data/rest/impl/KeysetPageableHandlerMethodArgumentResolver.java @@ -244,7 +244,7 @@ public KeysetPageable resolveArgument(MethodParameter methodParameter, ModelAndV int offset; if (StringUtils.hasText(offsetString)) { - offset = parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, false); + offset = parseAndApplyBoundaries(offsetString, Integer.MAX_VALUE, false); } else if (StringUtils.hasText(pageString)) { offset = pageSize * parseAndApplyBoundaries(pageString, Integer.MAX_VALUE, true); } else { diff --git a/integration/spring-data/testsuite/src/test/java/com/blazebit/persistence/spring/data/testsuite/DocumentControllerTest.java b/integration/spring-data/testsuite/src/test/java/com/blazebit/persistence/spring/data/testsuite/DocumentControllerTest.java index aa75a5fb66..79b6782d7f 100644 --- a/integration/spring-data/testsuite/src/test/java/com/blazebit/persistence/spring/data/testsuite/DocumentControllerTest.java +++ b/integration/spring-data/testsuite/src/test/java/com/blazebit/persistence/spring/data/testsuite/DocumentControllerTest.java @@ -65,6 +65,19 @@ public void testDocumentControllerDefaults() throws Exception { .andExpect(jsonPath("$.keysetPage.highest.tuple[0]", is(d2.getId().intValue()))); } + @Test + public void testDocumentControllerOffsetParameter() throws Exception { + // Given + createDocument("D1"); + Document d2 = createDocument("D2"); + + // When / Then + mockMvc.perform(get("/document-views?offset={offset}&size={size}", 1, 2)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.numberOfElements", is(1))) + .andExpect(jsonPath("$.content[0].id", is(d2.getId().intValue()))); + } + private Document createDocument(String name) { return createDocument(name, null); }