Skip to content

Commit 8097041

Browse files
authored
Merge pull request #2133 from l3r8yJ/2132
feat(2132): unwrap invocation target exception
2 parents 01710bb + 02a26ff commit 8097041

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

Diff for: graphql-dgs/src/main/kotlin/com/netflix/graphql/dgs/exceptions/DefaultDataFetcherExceptionHandler.kt

+8-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.slf4j.Logger
2525
import org.slf4j.LoggerFactory
2626
import org.slf4j.event.Level
2727
import org.springframework.util.ClassUtils
28+
import java.lang.reflect.InvocationTargetException
2829
import java.util.concurrent.CompletableFuture
2930
import java.util.concurrent.CompletionException
3031

@@ -50,6 +51,7 @@ open class DefaultDataFetcherExceptionHandler : DataFetcherExceptionHandler {
5051
isSpringSecurityAccessException(
5152
exception,
5253
) -> TypedGraphQLError.newPermissionDeniedBuilder()
54+
5355
else -> TypedGraphQLError.newInternalErrorBuilder()
5456
}
5557
builder
@@ -82,7 +84,12 @@ open class DefaultDataFetcherExceptionHandler : DataFetcherExceptionHandler {
8284
)
8385
}
8486

85-
private fun unwrapCompletionException(e: Throwable): Throwable = if (e is CompletionException && e.cause != null) e.cause!! else e
87+
private fun unwrapCompletionException(e: Throwable): Throwable =
88+
when (e) {
89+
is CompletionException -> unwrapCompletionException(e.cause ?: e)
90+
is InvocationTargetException -> unwrapCompletionException(e.targetException)
91+
else -> e
92+
}
8693

8794
protected val logger: Logger get() = DefaultDataFetcherExceptionHandler.logger
8895

Diff for: graphql-dgs/src/test/kotlin/com/netflix/graphql/dgs/exceptions/DefaultDataFetcherExceptionHandlerTest.kt

+21-1
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ import io.mockk.spyk
3131
import io.mockk.verify
3232
import org.assertj.core.api.Assertions.assertThat
3333
import org.junit.jupiter.api.Test
34+
import org.junit.jupiter.api.assertAll
3435
import org.slf4j.Logger
3536
import org.slf4j.event.Level
3637
import org.slf4j.spi.NOPLoggingEventBuilder
3738
import org.springframework.security.access.AccessDeniedException
38-
import java.lang.IllegalStateException
39+
import java.lang.reflect.InvocationTargetException
3940
import java.util.concurrent.CompletionException
4041

4142
class DefaultDataFetcherExceptionHandlerTest {
@@ -245,4 +246,23 @@ class DefaultDataFetcherExceptionHandlerTest {
245246
verify { loggerMock.atLevel(Level.ERROR) }
246247
confirmVerified(loggerMock)
247248
}
249+
250+
@Test
251+
fun `unwraps the invocation target exception`() {
252+
val invocation = InvocationTargetException(IllegalStateException("I'm illegal!"), "Target invocation happened")
253+
254+
val params =
255+
DataFetcherExceptionHandlerParameters
256+
.newExceptionParameters()
257+
.exception(invocation)
258+
.dataFetchingEnvironment(environment)
259+
.build()
260+
261+
val result = DefaultDataFetcherExceptionHandler().handleException(params).get()
262+
263+
assertAll(
264+
{ assertThat(result.errors.size).isEqualTo(1) },
265+
{ assertThat(result.errors[0].message).containsSubsequence("java.lang.IllegalStateException: I'm illegal!") },
266+
)
267+
}
248268
}

0 commit comments

Comments
 (0)