Skip to content

Commit 6e99c57

Browse files
authored
Update dependencies (#6889)
- Athenz 1.12.42 -> 1.12.44 - GraphQL Java 25.0 -> 26.0 - gRPC-Java 1.81.0 -> 1.83.0 - gRPC-Kotlin 1.4.1 -> 1.4.3 - Jackson 2.22.0 -> 2.22.1 - Javassist 3.31.0-GA -> 3.32.0-GA - java-jwt 4.5.2 -> 4.6.0 - JBoss Logging Annotations 2.2.1.Final -> 2.2.2.Final - Jetty 9.4 9.4.55.v20240627 -> 9.4.58.v20250814 - Jetty 12 12.0.32 -> 12.0.37 - JUnit 5 5.14.2 -> 5.14.4 - Kafka 3.9.1 -> 3.9.2 - Kotlin 2.4.0 -> 2.4.10 - Kubernetes Client 7.7.0 -> 7.8.0 - MCP 1.1.3 -> 2.0.0 - Netty 4.2.15.Final -> 4.2.16.Final - Prometheus 1.7.0 -> 1.8.0 - Protobuf 3.25.8 -> 3.25.9 - RESTEasy 5.0.9.Final -> 5.0.10.Final - Sangria 4.2.18 -> 4.2.19 - Spring 6 6.2.15 -> 6.2.19 - Spring Boot 3 3.5.10 -> 3.5.16 - Spring Boot 4 4.0.6 -> 4.1.0 - Tomcat 9 9.0.96 -> 9.0.120 - Tomcat 10 10.1.49 -> 10.1.57 - Build - Apache HttpClient 5 5.6.1 -> 5.6.2 - BouncyCastle 1.84 -> 1.85 - controlplane 1.0.52 -> 1.0.55 - Dagger 2.59.2 -> 2.60.1 - DGS 11.1.0 -> 12.0.1 - Error Prone 2.49.0 -> 2.50.0 - errorprone-gradle-plugin 4.3.0 -> 4.4.0 - fastutil 8.5.18 -> 8.5.19 - Gradle 9.5.1 -> 9.6.1 - graphql-kotlin 8.8.1 -> 9.2.1 - Hibernate Validator 8.0.3.Final -> 8.0.5.Final - Istio 1.29.1 -> 1.29.6 - JKube 1.19.0 -> 1.20.0 - JsonUnit 2.38.0 -> 2.40.1 - Logback 1.5 1.5.34 -> 1.5.38 - mcp-spring-ai 2.0.0-M4 -> 2.0.0 - micrometer-docs-generator 1.0.2 -> 1.0.4 - MUnit 1.3.2 -> 1.3.4 - NullAway 0.13.6 -> 0.13.8 - ProGuard 7.8.1 -> 7.9.1 - protobuf-gradle-plugin 0.9.5 -> 0.9.6 - Protobuf4 4.35.0 -> 4.35.1 - scalafmt-gradle-plugin 1.21.5 -> 1.21.6 - shadow-gradle-plugin 8.3.9 -> 8.3.11 Breaking changes: - The `:ai:mcp` module now builds against MCP Java SDK 2.x. `ArmeriaStatelessServerTransport` and `ArmeriaStreamableServerTransportProvider` keep their own API, but users must move their MCP SDK dependency from 1.1.x to 2.0.0, which renames `ElicitRequest` to `ElicitFormRequest` among other changes. Other changes: - `ImmutableAttributesBuilder.getAndSet()` declares `@Nullable` and returns `null` instead of the internal `NULL_VALUE` sentinel, which threw `ClassCastException` on a typed call. - `RampingUpLoadBalancer` asserts the entry returned by `Map.remove()` instead of dereferencing it, which NullAway 0.13.8 rejects; its test now checks the future of the emptied window. - `GraphqlWSSubProtocol` returns a non-null `GraphQLError#getMessage()`, as graphql-java 26 requires. - Dropped the stale `dgs` and `graphql-kotlin` hold comments; both consumers are already `java17`. - `:it:dgs` declares the Jackson modules DGS 12 expects Spring Boot to auto-configure. - The `upgrade-deps` skill now validates a hold comment against its consumers' Java level.
1 parent 550ed08 commit 6e99c57

10 files changed

Lines changed: 108 additions & 58 deletions

File tree

.claude/skills/upgrade-deps/SKILL.md

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ Java version required by the modules that use it.
2222

2323
When in doubt, check `settings.gradle` for the `java`, `java11`, or `java17` flag on each subproject.
2424

25+
**The table above lists published modules only.** Integration-test (`:it:*`) and example (`:examples:*`)
26+
modules carry their own flags in `settings.gradle` and are frequently `java17` already. A dependency
27+
consumed *only* by those modules is not held back by the Java 8 baseline at all — always resolve the
28+
actual consumer before assuming a Java constraint applies.
29+
2530
## Step 1: Run dependencyUpdates
2631

2732
```
@@ -55,8 +60,38 @@ reflections = "0.9.11"
5560
zookeeper = "3.9.3"
5661
```
5762

58-
If such a comment exists and the reason still applies, **skip the upgrade** and do not
59-
remove the comment.
63+
### Step 3.1: Validate the comment before trusting it
64+
65+
A hold comment is a claim about this repository, and claims go stale. **Never treat a comment as
66+
proof — re-derive its reason every upgrade.** For each held entry:
67+
68+
1. Find the aliases for the version key in the `[libraries.*]` / `[plugins]` sections.
69+
2. Grep the build scripts for each alias accessor (`libs.foo.bar` for alias `foo-bar`):
70+
`git grep -n 'libs\.foo\.bar' -- '*.gradle' '*.gradle.kts'`
71+
3. Map each hit's build file to its project, and read that project's flags in `settings.gradle`.
72+
4. Compare the *consumer's* Java level against the new version's requirement — **not** the library's
73+
requirement in isolation. "Library X requires Java 17" is not a blocker when every consumer is
74+
already `java17`.
75+
76+
If the reason no longer holds, **remove the comment and upgrade**. If it still holds, keep both.
77+
78+
Two comments were found stale this way (`dgs` and `graphql-kotlin`, both consumed only by `java17`
79+
modules), so treat this step as mandatory rather than a spot check.
80+
81+
### Step 3.2: Never write a hold reason you have not verified
82+
83+
When you add a comment, the reason must be something you confirmed, with the evidence to hand:
84+
85+
- **Java constraint** — confirmed against the consumer module's flag, per Step 3.1.
86+
- **Runtime/API breakage** — confirmed by actually building and running the affected module's tests,
87+
and the comment names the concrete blocker (e.g. `# Don't upgrade graphql-kotlin to 10.x that
88+
migrated to Jackson 3`), not a vague "major upgrade deferred".
89+
- **Version-sync constraint** — confirmed from the other project's POM *and* from this repo's history
90+
(`git log -p -- dependencies.toml`). Do not invent a sync rule: check whether the two versions have
91+
ever actually moved independently before claiming they must move together.
92+
93+
A plausible-sounding reason that nobody verified is worse than no comment, because the next upgrade
94+
will trust it.
6095

6196
If no comment exists, proceed with the Java version compatibility check:
6297
1. Find which modules use this dependency in `dependencies.toml`

ai/mcp/src/test/java/io/modelcontextprotocol/ArmeriaStreamableIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import io.modelcontextprotocol.spec.McpSchema;
5454
import io.modelcontextprotocol.spec.McpSchema.CallToolResult;
5555
import io.modelcontextprotocol.spec.McpSchema.ClientCapabilities;
56+
import io.modelcontextprotocol.spec.McpSchema.ElicitFormRequest;
5657
import io.modelcontextprotocol.spec.McpSchema.ElicitRequest;
5758
import io.modelcontextprotocol.spec.McpSchema.ElicitResult;
5859
import io.modelcontextprotocol.spec.McpSchema.InitializeResult;
@@ -99,7 +100,7 @@ protected void prepareClients(int port, String mcpEndpoint) {
99100
void testCreateElicitationSuccess(String clientType) {
100101
final var clientBuilder = clientBuilders.get(clientType);
101102

102-
final Function<ElicitRequest, ElicitResult> elicitationHandler = request -> {
103+
final Function<ElicitFormRequest, ElicitResult> elicitationHandler = request -> {
103104
assertThat(request.message()).isNotEmpty();
104105
assertThat(request.requestedSchema()).isNotNull();
105106
return new McpSchema.ElicitResult(McpSchema.ElicitResult.Action.ACCEPT,

core/src/main/java/com/linecorp/armeria/common/ImmutableAttributesBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public <T> AttributesBuilder set(AttributeKey<T> key, @Nullable T value) {
4444
return this;
4545
}
4646

47+
@Nullable
4748
@Override
4849
public <T> T getAndSet(AttributeKey<T> key, @Nullable T value) {
4950
requireNonNull(key, "key");
@@ -60,7 +61,7 @@ public <T> T getAndSet(AttributeKey<T> key, @Nullable T value) {
6061
oldValue = attributes.put(key, value);
6162
}
6263
//noinspection unchecked
63-
return (T) oldValue;
64+
return oldValue == NULL_VALUE ? null : (T) oldValue;
6465
}
6566

6667
@Override

core/src/main/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,9 @@ private void updateWeightAndStep0(long window) {
261261
final Set<CandidateAndStep<T>> candidateAndSteps = entry.candidateAndSteps();
262262
updateWeightAndStep0(candidateAndSteps);
263263
if (candidateAndSteps.isEmpty()) {
264-
rampingUpWindowsMap.remove(window).scheduledFuture.cancel(true);
264+
final CandidatesRampingUpEntry<T> removed = rampingUpWindowsMap.remove(window);
265+
assert removed != null;
266+
removed.scheduledFuture.cancel(true);
265267
}
266268
buildLoadBalancer();
267269
}

core/src/test/java/com/linecorp/armeria/client/ImmutableAttributesTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ void parent() {
101101
// Hide the value in the parent
102102
assertThat(attributes.attr(shaded)).isNull();
103103
assertThat(attributes.ownAttr(shaded)).isNull();
104+
// getAndSet() must return null for a hidden key, not the internal sentinel.
105+
assertThat(attributes.toBuilder().getAndSet(shaded, "revive")).isNull();
104106

105107
assertThat(attributes.attr(overridden)).isEqualTo("update");
106108
assertThat(attributes.ownAttr(overridden)).isEqualTo("update");

core/src/test/java/com/linecorp/armeria/common/loadbalancer/RampingUpLoadBalancerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,8 @@ void rampingUpEndpointsAreRemoved() {
345345
Endpoint.of("foo.com"), Endpoint.of("foo1.com")
346346
);
347347
assertThat(scheduledFutures).hasSize(2);
348+
// The first future was already cancelled in setInitialEndpoints().
349+
scheduledFutures.poll();
348350
verify(scheduledFutures.poll()).cancel(true);
349351
}
350352

dependencies.toml

Lines changed: 53 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ akka = "2.8.8"
33
# Keep in sync with Akka HTTP artifacts pulled by akka-grpc-runtime to avoid mixed-versioning errors.
44
akka-http-cors = "1.0.0"
55
akka-grpc-runtime = "1.0.3"
6-
apache-httpclient5 = "5.6.1"
6+
apache-httpclient5 = "5.6.2"
77
apache-httpclient4 = "4.5.14"
88
asm = "9.10.1"
99
assertj = "3.27.7"
10-
athenz = "1.12.42"
10+
athenz = "1.12.44"
1111
awaitility = "4.3.0"
1212
blockhound = "1.0.17.RELEASE"
13-
bouncycastle = "1.84"
13+
bouncycastle = "1.85"
1414
brave5 = "5.18.1"
1515
brave6 = "6.3.1"
1616
brotli4j = "1.23.0"
@@ -22,40 +22,40 @@ cglib = "3.3.0"
2222
checkerframework = "2.5.6"
2323
checkstyle = "10.3.2"
2424
context-propagation = "1.2.1"
25-
controlplane = "1.0.52"
25+
controlplane = "1.0.55"
2626
curator = "5.9.0"
27-
dagger = "2.59.2"
28-
# Don't upgrade DGS to 12.x that requires Java 17.
29-
dgs = "11.1.0"
27+
dagger = "2.60.1"
28+
dgs = "12.0.1"
3029
dropwizard2 = "2.1.12"
3130
dropwizard-metrics = "4.2.39"
32-
errorprone = "2.49.0"
33-
errorprone-gradle-plugin = "4.3.0"
31+
errorprone = "2.50.0"
32+
errorprone-gradle-plugin = "4.4.0"
3433
eureka = "2.0.6"
35-
fastutil = "8.5.18"
34+
fastutil = "8.5.19"
3635
finagle = "24.2.0"
3736
findbugs = "3.0.2"
3837
futures-completable = "0.3.6"
3938
futures-extra = "4.3.3"
4039
# Keep gax-grpc at 2.72.2; newer versions pull protobuf 4.x via proto-google-common-protos,
4140
# which conflicts with the protobuf 3.x line used elsewhere (see grpc testCompileClasspath).
4241
gax-grpc = "2.72.2"
43-
graphql-java = "25.0"
44-
graphql-kotlin = "8.8.1"
45-
grpc-java = "1.81.0"
42+
graphql-java = "26.0"
43+
# Don't upgrade graphql-kotlin to 10.x that migrated to Jackson 3 (the `tools.jackson` package).
44+
graphql-kotlin = "9.2.1"
45+
grpc-java = "1.83.0"
4646
# 1.5.0 requires >= 17
47-
grpc-kotlin = "1.4.1"
47+
grpc-kotlin = "1.4.3"
4848
guava = "33.6.0-jre"
4949
hamcrest = "3.0"
5050
hbase = "1.2.6"
5151
hibernate-validator6 = "6.2.5.Final"
52-
hibernate-validator8 = "8.0.3.Final"
52+
hibernate-validator8 = "8.0.5.Final"
5353
# used by :it:xds-istio
54-
istio = "1.29.1"
54+
istio = "1.29.6"
5555
j2objc = "3.1"
5656
json-path = "3.0.0"
57-
jackson = "2.22.0"
58-
javassist = "3.31.0-GA"
57+
jackson = "2.22.1"
58+
javassist = "3.32.0-GA"
5959
jakarta-inject = "2.0.1"
6060
jakarta-validation = "3.1.1"
6161
jakarta-websocket = "2.2.0"
@@ -71,49 +71,49 @@ jetty10 = "10.0.26"
7171
jetty10-jstl = "10.0.26"
7272
jetty11 = "11.0.26"
7373
jetty11-jstl = "11.0.0"
74-
jetty12 = "12.0.32"
74+
jetty12 = "12.0.37"
7575
jetty93 = "9.3.30.v20211001"
76-
jetty94 = "9.4.55.v20240627"
76+
jetty94 = "9.4.58.v20250814"
7777
jetty-alpn-api = "1.1.3.v20160715"
78-
jkube = "1.19.0"
78+
jkube = "1.20.0"
7979
jmh-core = "1.37"
8080
jmh-gradle-plugin = "0.7.3"
8181
joor = "0.9.15"
8282
# Don't upgrade json-unit to 3.0.0 that requires Java 17
83-
json-unit = "2.38.0"
83+
json-unit = "2.40.1"
8484
jsoup = "1.22.2"
8585
jspecify = "1.0.0"
8686
junit4 = "4.13.2"
8787
# junit6 requires java 17
88-
junit5 = "5.14.2"
88+
junit5 = "5.14.4"
8989
# Don't upgrade junit-pioneer to 2.x.x that requires Java 11
9090
junit-pioneer = "1.9.1"
91-
jwt = "4.5.2"
91+
jwt = "4.6.0"
9292
# kafka >=4.0.0 requires java 11
93-
kafka = "3.9.1"
94-
kotlin = "2.4.0"
93+
kafka = "3.9.2"
94+
kotlin = "2.4.10"
9595
kotlin-coroutine = "1.11.0"
9696
krotodc = "1.2.2"
9797
ktlint-gradle-plugin = "14.2.0"
98-
kubernetes-client = "7.7.0"
98+
kubernetes-client = "7.8.0"
9999
logback12 = "1.2.13"
100100
logback13 = "1.3.14"
101101
logback14 = "1.4.14"
102-
logback15 = "1.5.34"
103-
mcp = "1.1.3"
102+
logback15 = "1.5.38"
103+
mcp = "2.0.0"
104104
# Only used for testing in :ai:mcp module.
105-
mcp-spring-ai = "2.0.0-M4"
105+
mcp-spring-ai = "2.0.0"
106106
micrometer = "1.17.0"
107107
micrometer-tracing = "1.7.0"
108-
micrometer-docs-generator = "1.0.2"
108+
micrometer-docs-generator = "1.0.4"
109109
# Don't uprade mockito to 5.x.x that requires Java 11
110110
mockito = "4.11.0"
111111
monix = "3.4.1"
112-
munit = "1.3.2"
112+
munit = "1.3.4"
113113
netty = "4.2.16.Final"
114114
nexus-publish = "2.0.0"
115115
node-gradle-plugin = "7.1.0"
116-
nullaway = "0.13.6"
116+
nullaway = "0.13.8"
117117
nullaway-gradle-plugin = "3.1.0"
118118
okhttp2 = "2.7.5" # For testing
119119
okhttp3 = { strictly = "3.14.9" } # Not just for testing. Used in the Retrofit mudule.
@@ -124,16 +124,16 @@ osdetector = "1.7.3"
124124
# Used for kubernetes-chaos-tests
125125
picocli = "4.7.7"
126126
protoc-gen-validate = "1.3.3"
127-
proguard = "7.8.1"
128-
prometheus = "1.7.0"
127+
proguard = "7.9.1"
128+
prometheus = "1.8.0"
129129
prometheus-legacy = "0.16.0"
130130
# Ensure that we use the same Protobuf version as what gRPC depends on.
131131
# See: https://github.com/grpc/grpc-java/blob/master/gradle/libs.versions.toml
132132
# (Switch to the right tag and look for "protobuf".)
133133
# e.g. https://github.com/grpc/grpc-java/blob/v1.48.0/gradle/libs.versions.toml
134-
protobuf = "3.25.8"
135-
protobuf4 = "4.35.0"
136-
protobuf-gradle-plugin = "0.9.5"
134+
protobuf = "3.25.9"
135+
protobuf4 = "4.35.1"
136+
protobuf-gradle-plugin = "0.9.6"
137137
protobuf-jackson = "2.8.1"
138138
re2j = "1.8"
139139
reactive-grpc = "1.2.4"
@@ -143,37 +143,37 @@ reactor-kotlin = "1.3.1"
143143
# Upgrade once https://github.com/ronmamo/reflections/issues/279 is fixed.
144144
reflections = "0.9.11"
145145
resilience4j = "2.4.0"
146-
resteasy = "5.0.9.Final"
146+
resteasy = "5.0.10.Final"
147147
# "provided" dependency required by RESTEasy "resteasy-core-spi"
148148
# jboss 3.5.0 requires at least jdk 11
149149
resteasy-jboss-logging = "3.4.3.Final"
150-
resteasy-jboss-logging-annotations = "2.2.1.Final"
150+
resteasy-jboss-logging-annotations = "2.2.2.Final"
151151
retrofit2 = "2.12.0"
152152
rxjava2 = "2.2.21"
153153
rxjava3 = "3.1.12"
154-
sangria = "4.2.18"
154+
sangria = "4.2.19"
155155
sangria-slowlog = "3.0.0"
156156
scala-collection-compat = "2.14.0"
157157
scala-java8-compat = "1.0.2"
158158
scala212 = "2.12.21"
159159
scala213 = "2.13.18"
160160
# Scala 3.8.x requires JDK 17+
161161
scala3 = "3.7.4"
162-
scalafmt-gradle-plugin = "1.21.5"
162+
scalafmt-gradle-plugin = "1.21.6"
163163
scalapb = "0.11.20"
164164
scalapb-json = "0.12.2"
165-
shadow-gradle-plugin = "8.3.9"
165+
shadow-gradle-plugin = "8.3.11"
166166
# Don"t upgrade to 8.x that requires Java 11.
167167
shibboleth-utilities = "7.5.2"
168168
snappy = "1.1.10.8"
169169
slf4j = "1.7.36"
170170
slf4j2 = "2.0.18"
171171
spring5 = "5.3.39"
172-
spring6 = "6.2.15"
172+
spring6 = "6.2.19"
173173
spring7 = "7.0.8"
174174
spring-boot2 = "2.7.18"
175-
spring-boot3 = "3.5.10"
176-
spring-boot4 = "4.0.6"
175+
spring-boot3 = "3.5.16"
176+
spring-boot4 = "4.1.0"
177177
testcontainers = "2.0.5"
178178
thrift09 = { strictly = "0.9.3-1" }
179179
thrift012 = { strictly = "0.12.0" }
@@ -189,8 +189,8 @@ thrift021 = { strictly = "0.21.0" }
189189
thrift022 = { strictly = "0.22.0" }
190190
thrift023 = { strictly = "0.23.0" }
191191
tomcat8 = "8.5.100"
192-
tomcat9 = "9.0.96"
193-
tomcat10 = "10.1.49"
192+
tomcat9 = "9.0.120"
193+
tomcat10 = "10.1.57"
194194
xml-apis = "1.4.01"
195195
# Ensure that we use the same ZooKeeper version as what Curator depends on.
196196
# See: https://github.com/apache/curator/blob/master/pom.xml
@@ -631,6 +631,9 @@ javadocs = "https://fasterxml.github.io/jackson-modules-java8/javadoc/datetime/2
631631
module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml"
632632
[libraries.jackson-kotlin]
633633
module = "com.fasterxml.jackson.module:jackson-module-kotlin"
634+
# Jackson parameter names is used only for testing in it:dgs module.
635+
[libraries.jackson-parameter-names]
636+
module = "com.fasterxml.jackson.module:jackson-module-parameter-names"
634637
[libraries.jackson-scala_v212]
635638
module = "com.fasterxml.jackson.module:jackson-module-scala_2.12"
636639
[libraries.jackson-scala_v213]
@@ -705,7 +708,7 @@ version.ref = "jetty11"
705708

706709
[libraries.jetty12-server]
707710
module = "org.eclipse.jetty:jetty-server"
708-
javadocs = "https://javadoc.io/doc/org.eclipse.jetty/jetty-server/12.0.5/"
711+
javadocs = "https://javadoc.io/doc/org.eclipse.jetty/jetty-server/12.0.37/"
709712
version.ref = "jetty12"
710713
[libraries.jetty12-ee10-apache-jsp]
711714
module = "org.eclipse.jetty.ee10:jetty-ee10-apache-jsp"
@@ -749,7 +752,7 @@ exclusions = ["org.ow2.asm:asm", "org.ow2.asm:asm-commons"]
749752
version.ref = "jetty94"
750753
[libraries.jetty94-server]
751754
module = "org.eclipse.jetty:jetty-server"
752-
javadocs = "https://javadoc.io/doc/org.eclipse.jetty/jetty-server/9.4.51.v20230217/"
755+
javadocs = "https://javadoc.io/doc/org.eclipse.jetty/jetty-server/9.4.58.v20250814/"
753756
version.ref = "jetty94"
754757
# jetty-webapp for testing interoperability with other servers.
755758
[libraries.jetty94-webapp]

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-all.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-all.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

graphql/src/main/java/com/linecorp/armeria/server/graphql/GraphqlWSSubProtocol.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,10 +374,11 @@ private static void writeError(WebSocketWriter out, String operationId, Throwabl
374374
"id", operationId,
375375
"payload", ImmutableList.of(
376376
new GraphQLError() {
377-
@Nullable
378377
@Override
379378
public String getMessage() {
380-
return t.getMessage();
379+
// GraphQLError.getMessage() is non-null, but Throwable.getMessage() is not.
380+
final String message = t.getMessage();
381+
return message != null ? message : t.toString();
381382
}
382383

383384
@Override

it/dgs/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ dependencies {
66

77
implementation 'com.graphql-java:graphql-java:19.2'
88
testImplementation libs.dgs
9+
// DGS 12 expects the Jackson modules that Spring Boot auto-configures; this test runs without it.
10+
testImplementation libs.jackson.kotlin
11+
testImplementation libs.jackson.parameter.names
912
}

0 commit comments

Comments
 (0)