From bc8b0277c640d01d467cbfd03582660a240aa526 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 21 May 2025 09:28:14 +0200 Subject: [PATCH] Upgrade to Spring Framework 7.0.0-M4 This commit requires Spring Framework 7.0 to run applications. This also means we follow Framework 7.0's baseline with Jakarta 11. See gh-1202 --- build.gradle | 2 +- platform/build.gradle | 12 ++++++------ spring-graphql/build.gradle | 2 +- ...FactoryInitializationAotProcessorTests.java | 11 +++++------ .../webflux/GraphQlWebSocketHandlerTests.java | 18 +++++++++--------- .../server/webmvc/GraphQlSseHandlerTests.java | 4 +++- .../webmvc/GraphQlWebSocketHandlerTests.java | 18 +++++++++--------- 7 files changed, 34 insertions(+), 33 deletions(-) diff --git a/build.gradle b/build.gradle index ec783870..79a903d4 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ description = "Spring for GraphQL" ext { moduleProjects = [project(":spring-graphql"), project(":spring-graphql-test")] - springFrameworkVersion = "6.2.7" + springFrameworkVersion = "7.0.0-M4" graphQlJavaVersion = "24.0" springBootVersion = "3.4.3" } diff --git a/platform/build.gradle b/platform/build.gradle index 93ffe0b8..aeb59cb2 100644 --- a/platform/build.gradle +++ b/platform/build.gradle @@ -28,10 +28,10 @@ dependencies { api("com.graphql-java:graphql-java:${graphQlJavaVersion}") api("io.micrometer:context-propagation:1.1.3") - api("jakarta.annotation:jakarta.annotation-api:2.1.1") - api("jakarta.servlet:jakarta.servlet-api:6.0.0") - api("jakarta.validation:jakarta.validation-api:3.0.2") - api("jakarta.persistence:jakarta.persistence-api:3.1.0") + api("jakarta.annotation:jakarta.annotation-api:3.0.0") + api("jakarta.servlet:jakarta.servlet-api:6.1.0") + api("jakarta.validation:jakarta.validation-api:3.1.0") + api("jakarta.persistence:jakarta.persistence-api:3.2.0") api("com.apollographql.federation:federation-graphql-java-support:5.4.0") api("com.netflix.graphql.dgs.codegen:graphql-dgs-codegen-shared-core:8.0.4") @@ -43,8 +43,8 @@ dependencies { api("com.squareup.okhttp3:mockwebserver:4.12.0") api("com.h2database:h2:2.3.232") - api("org.hibernate:hibernate-core:6.6.11.Final") - api("org.hibernate.validator:hibernate-validator:8.0.2.Final") + api("org.hibernate.orm:hibernate-core:7.0.0.CR1") + api("org.hibernate.validator:hibernate-validator:9.0.0.CR1") api("org.mongodb:bson:5.3.1") api("org.mongodb:mongodb-driver-core:5.3.1") api("org.mongodb:mongodb-driver-reactivestreams:5.3.1") diff --git a/spring-graphql/build.gradle b/spring-graphql/build.gradle index 3809ceb6..12b56d35 100644 --- a/spring-graphql/build.gradle +++ b/spring-graphql/build.gradle @@ -62,7 +62,7 @@ dependencies { } testImplementation 'io.micrometer:micrometer-tracing-test' testImplementation 'com.h2database:h2' - testImplementation 'org.hibernate:hibernate-core' + testImplementation 'org.hibernate.orm:hibernate-core' testImplementation 'org.hibernate.validator:hibernate-validator' testImplementation 'org.springframework.data:spring-data-mongodb' testImplementation 'org.springframework.data:spring-data-neo4j' diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingBeanFactoryInitializationAotProcessorTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingBeanFactoryInitializationAotProcessorTests.java index 295aa563..22faa596 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingBeanFactoryInitializationAotProcessorTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/SchemaMappingBeanFactoryInitializationAotProcessorTests.java @@ -571,14 +571,13 @@ class SchemaMappingBeanFactoryInitializationAotProcessorTests { } private void assertThatIntrospectionOnMethodsHintRegisteredForType(Class type) { - Predicate predicate = RuntimeHintsPredicates.reflection() - .onType(type).withAnyMemberCategory(MemberCategory.INTROSPECT_DECLARED_METHODS); + Predicate predicate = RuntimeHintsPredicates.reflection().onType(type); assertThat(predicate).accepts(this.generationContext.getRuntimeHints()); } private void assertThatInvocationHintRegisteredForMethods(Class type, String... methodNames) { Predicate predicate = Arrays.stream(methodNames) - .map(methodName -> (Predicate) RuntimeHintsPredicates.reflection().onMethod(type, methodName)) + .map(methodName -> RuntimeHintsPredicates.reflection().onMethodInvocation(type, methodName)) .reduce(Predicate::and) .orElseThrow(() -> new IllegalArgumentException("Could not generate predicate on type " + type + " for methods " + Arrays.toString(methodNames))); assertThat(predicate).accepts(this.generationContext.getRuntimeHints()); @@ -602,18 +601,18 @@ class SchemaMappingBeanFactoryInitializationAotProcessorTests { private Predicate javaBeanBindingOnType(Class type) { Predicate predicate = RuntimeHintsPredicates.reflection().onType(type) - .withMemberCategories(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); + .withMemberCategories(MemberCategory.ACCESS_DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); try { BeanInfo beanInfo = Introspector.getBeanInfo(type); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { Method readMethod = propertyDescriptor.getReadMethod(); if (readMethod != null && readMethod.getDeclaringClass() != Object.class) { - predicate = predicate.and(RuntimeHintsPredicates.reflection().onMethod(readMethod)); + predicate = predicate.and(RuntimeHintsPredicates.reflection().onMethodInvocation(readMethod)); } Method writeMethod = propertyDescriptor.getWriteMethod(); if (writeMethod != null && writeMethod.getDeclaringClass() != Object.class) { - predicate = predicate.and(RuntimeHintsPredicates.reflection().onMethod(writeMethod)); + predicate = predicate.and(RuntimeHintsPredicates.reflection().onMethodInvocation(writeMethod)); } } } diff --git a/spring-graphql/src/test/java/org/springframework/graphql/server/webflux/GraphQlWebSocketHandlerTests.java b/spring-graphql/src/test/java/org/springframework/graphql/server/webflux/GraphQlWebSocketHandlerTests.java index 15d218ae..31838e3a 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/server/webflux/GraphQlWebSocketHandlerTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/server/webflux/GraphQlWebSocketHandlerTests.java @@ -386,15 +386,15 @@ class GraphQlWebSocketHandlerTests extends WebSocketHandlerTestSupport { new ReflectiveRuntimeHintsRegistrar().registerRuntimeHints(runtimeHints, GraphQlWebSocketHandler.class); ReflectionHintsPredicates reflection = RuntimeHintsPredicates.reflection(); assertThat(reflection.onType(GraphQlWebSocketMessage.class)).accepts(runtimeHints); - assertThat(reflection.onField(GraphQlWebSocketMessage.class, "id")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "getId")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "setId")).accepts(runtimeHints); - assertThat(reflection.onField(GraphQlWebSocketMessage.class, "type")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "getType")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "setType")).accepts(runtimeHints); - assertThat(reflection.onField(GraphQlWebSocketMessage.class, "payload")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "getPayload")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "setPayload")).accepts(runtimeHints); + assertThat(reflection.onFieldAccess(GraphQlWebSocketMessage.class, "id")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "getId")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "setId")).accepts(runtimeHints); + assertThat(reflection.onFieldAccess(GraphQlWebSocketMessage.class, "type")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "getType")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "setType")).accepts(runtimeHints); + assertThat(reflection.onFieldAccess(GraphQlWebSocketMessage.class, "payload")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "getPayload")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "setPayload")).accepts(runtimeHints); } private TestWebSocketSession handle(Flux input, WebGraphQlInterceptor... interceptors) { diff --git a/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlSseHandlerTests.java b/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlSseHandlerTests.java index f79eaf8e..2a70912b 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlSseHandlerTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlSseHandlerTests.java @@ -18,6 +18,7 @@ package org.springframework.graphql.server.webmvc; import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.List; @@ -190,7 +191,8 @@ class GraphQlSseHandlerTests { HttpServletResponse servletResponse = mock(HttpServletResponse.class); ServletOutputStream outputStream = mock(ServletOutputStream.class); - willThrow(new IOException("broken pipe")).given(outputStream).write(any()); + willThrow(new IOException("broken pipe")).given(outputStream).write(any(byte[].class)); + willThrow(new IOException("broken pipe")).given(outputStream).write(any(ByteBuffer.class)); given(servletResponse.getOutputStream()).willReturn(outputStream); ServerRequest request = ServerRequest.create(servletRequest, MESSAGE_READERS); diff --git a/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlWebSocketHandlerTests.java b/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlWebSocketHandlerTests.java index f74653c1..90a7f287 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlWebSocketHandlerTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/server/webmvc/GraphQlWebSocketHandlerTests.java @@ -456,15 +456,15 @@ class GraphQlWebSocketHandlerTests extends WebSocketHandlerTestSupport { new ReflectiveRuntimeHintsRegistrar().registerRuntimeHints(runtimeHints, GraphQlWebSocketHandler.class); ReflectionHintsPredicates reflection = RuntimeHintsPredicates.reflection(); assertThat(reflection.onType(GraphQlWebSocketMessage.class)).accepts(runtimeHints); - assertThat(reflection.onField(GraphQlWebSocketMessage.class, "id")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "getId")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "setId")).accepts(runtimeHints); - assertThat(reflection.onField(GraphQlWebSocketMessage.class, "type")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "getType")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "setType")).accepts(runtimeHints); - assertThat(reflection.onField(GraphQlWebSocketMessage.class, "payload")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "getPayload")).accepts(runtimeHints); - assertThat(reflection.onMethod(GraphQlWebSocketMessage.class, "setPayload")).accepts(runtimeHints); + assertThat(reflection.onFieldAccess(GraphQlWebSocketMessage.class, "id")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "getId")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "setId")).accepts(runtimeHints); + assertThat(reflection.onFieldAccess(GraphQlWebSocketMessage.class, "type")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "getType")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "setType")).accepts(runtimeHints); + assertThat(reflection.onFieldAccess(GraphQlWebSocketMessage.class, "payload")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "getPayload")).accepts(runtimeHints); + assertThat(reflection.onMethodInvocation(GraphQlWebSocketMessage.class, "setPayload")).accepts(runtimeHints); } private void handle(GraphQlWebSocketHandler handler, TextMessage... textMessages) throws Exception {