diff --git a/spring-graphql/src/main/java/org/springframework/graphql/observation/GraphQlObservationInstrumentation.java b/spring-graphql/src/main/java/org/springframework/graphql/observation/GraphQlObservationInstrumentation.java index 47567553..6faa8e6d 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/observation/GraphQlObservationInstrumentation.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/observation/GraphQlObservationInstrumentation.java @@ -203,7 +203,7 @@ public class GraphQlObservationInstrumentation extends SimplePerformantInstrumen } else { GraphQLContext localContext = dataFetcherLocalContext == null ? - GraphQLContext.getDefault() : dataFetcherLocalContext; + GraphQLContext.getDefault() : GraphQLContext.newContext().of(dataFetcherLocalContext).build(); return DataFetcherResult.newResult() .data(value) .localContext(localContext.put(ObservationThreadLocalAccessor.KEY, dataFetcherObservation)) diff --git a/spring-graphql/src/test/java/org/springframework/graphql/observation/GraphQlObservationInstrumentationTests.java b/spring-graphql/src/test/java/org/springframework/graphql/observation/GraphQlObservationInstrumentationTests.java index b664ffc9..9a652fe8 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/observation/GraphQlObservationInstrumentationTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/observation/GraphQlObservationInstrumentationTests.java @@ -16,6 +16,7 @@ package org.springframework.graphql.observation; +import graphql.GraphQLContext; import graphql.GraphqlErrorBuilder; import graphql.execution.DataFetcherResult; import graphql.schema.AsyncDataFetcher; @@ -279,4 +280,39 @@ class GraphQlObservationInstrumentationTests { ResponseHelper.forResponse(responseMono); } + @Test + void shouldNotOverrideExistingLocalContext() { + + String document = """ + { + bookById(id: 1) { + author { + firstName, + lastName + } + } + } + """; + DataFetcher> bookDataFetcher = environment -> DataFetcherResult.newResult() + .data(BookSource.getBook(1L)) + .localContext(GraphQLContext.newContext().of("test", "value").build()) + .build(); + DataFetcher authorDataFetcher = environment -> BookSource.getAuthor(101L); + DataFetcher authorFirstNameDataFetcher = environment -> { + GraphQLContext context = environment.getLocalContext(); + String value = context.get("test"); + assertThat(value).isEqualTo("value"); + return BookSource.getAuthor(101L).getFirstName(); + }; + + ExecutionGraphQlRequest request = TestExecutionRequest.forDocument(document); + Mono responseMono = graphQlSetup + .queryFetcher("bookById", bookDataFetcher) + .dataFetcher("Book", "author", authorDataFetcher) + .dataFetcher("Author", "firstName", authorFirstNameDataFetcher) + .toGraphQlService() + .execute(request); + ResponseHelper.forResponse(responseMono); + } + }