From 7462b6a7587aff615d5b83e8fc699813c54546ba Mon Sep 17 00:00:00 2001 From: Ilya Bakaev Date: Mon, 20 Oct 2025 21:22:14 +0200 Subject: [PATCH] Add enum and number values support to JsonKeysetCursorStrategy Signed-off-by: Ilya Bakaev --- .../data/query/JsonKeysetCursorStrategy.java | 10 +++- .../query/JsonKeysetCursorStrategyTests.java | 56 +++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategy.java b/spring-graphql/src/main/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategy.java index 0a0eef96..49f8339e 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategy.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategy.java @@ -147,7 +147,8 @@ public Map fromCursor(String cursor) { /** * Customizes the {@link ObjectMapper} to use default typing that supports - * {@link Date}, {@link Calendar}, {@link UUID} and classes in {@code java.time}. + * {@link Date}, {@link Calendar}, {@link UUID}, {@link Number} + * {@link Enum} and classes in {@code java.time}. */ private static final class JacksonObjectMapperCustomizer { @@ -159,6 +160,8 @@ static void customize(CodecConfigurer configurer) { .allowIfSubType(Calendar.class) .allowIfSubType(Date.class) .allowIfSubType(UUID.class) + .allowIfSubType(Number.class) + .allowIfSubType(Enum.class) .build(); JsonMapper mapper = JsonMapper.builder() @@ -174,7 +177,8 @@ static void customize(CodecConfigurer configurer) { /** * Customizes the {@link ObjectMapper} to use default typing that supports - * {@link Date}, {@link Calendar}, {@link UUID} and classes in {@code java.time}. + * {@link Date}, {@link Calendar}, {@link UUID}, {@link Number}, + * {@link Enum} and classes in {@code java.time}. */ @SuppressWarnings("removal") private static final class Jackson2ObjectMapperCustomizer { @@ -188,6 +192,8 @@ static void customize(CodecConfigurer configurer) { .allowIfSubType(Calendar.class) .allowIfSubType(Date.class) .allowIfSubType(UUID.class) + .allowIfSubType(Number.class) + .allowIfSubType(Enum.class) .build(); com.fasterxml.jackson.databind.ObjectMapper mapper = Jackson2ObjectMapperBuilder.json().build(); diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategyTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategyTests.java index d93faf2a..a6eccbff 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategyTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/query/JsonKeysetCursorStrategyTests.java @@ -16,6 +16,8 @@ package org.springframework.graphql.data.query; +import java.math.BigDecimal; +import java.math.MathContext; import java.time.LocalDateTime; import java.time.Month; import java.time.ZoneId; @@ -91,4 +93,58 @@ void toAndFromCursorWithUUID() { assertThat(this.cursorStrategy.toCursor(keys)).isEqualTo(json); assertThat(this.cursorStrategy.fromCursor(json)).isEqualTo(keys); } + + @Test + void toAndFromCursorWithNumber() { + Map keys = new LinkedHashMap<>(); + keys.put("byteValue", (byte) 1); + keys.put("shortValue", (short) 2); + keys.put("intValue", 3); + keys.put("longValue", (long) 4); + keys.put("floatValue", (float) 5); + keys.put("doubleValue", (double) 6); + keys.put("bigDecimal", new BigDecimal("10000000000000000000.002")); + + //language=JSON + String json = """ + [ + "java.util.LinkedHashMap", + { + "byteValue": ["java.lang.Byte", 1], + "shortValue": ["java.lang.Short", 2], + "intValue": 3, + "longValue": ["java.lang.Long", 4], + "floatValue": ["java.lang.Float", 5.0], + "doubleValue": 6.0, + "bigDecimal": ["java.math.BigDecimal", 10000000000000000000.002] + } + ] + """.replaceAll("\\s+", ""); + + assertThat(this.cursorStrategy.toCursor(keys)).isEqualTo(json); + assertThat(this.cursorStrategy.fromCursor(json)).isEqualTo(keys); + } + + @Test + void toAndFromCursorWithEnum() { + Map keys = new LinkedHashMap<>(); + keys.put("enumValue", TestEnum.VALUE_1); + + //language=JSON + String json = """ + [ + "java.util.LinkedHashMap", + { + "enumValue": ["org.springframework.graphql.data.query.JsonKeysetCursorStrategyTests$TestEnum", "VALUE_1"] + } + ] + """.replaceAll("\\s+", ""); + + assertThat(this.cursorStrategy.toCursor(keys)).isEqualTo(json); + assertThat(this.cursorStrategy.fromCursor(json)).isEqualTo(keys); + } + + enum TestEnum { + VALUE_1 + } }