2 changed files with 43 additions and 0 deletions
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
package org.springframework.web.server |
||||
|
||||
import kotlinx.coroutines.Dispatchers |
||||
import kotlinx.coroutines.reactor.mono |
||||
import reactor.core.publisher.Mono |
||||
import kotlin.coroutines.CoroutineContext |
||||
|
||||
abstract class CoWebExceptionHandler : WebExceptionHandler { |
||||
final override fun handle(exchange: ServerWebExchange, ex: Throwable): Mono<Void> { |
||||
val context = exchange.attributes[CoWebFilter.COROUTINE_CONTEXT_ATTRIBUTE] as CoroutineContext? |
||||
return mono(context ?: Dispatchers.Unconfined) { coHandle(exchange, ex) }.then() |
||||
} |
||||
|
||||
protected abstract suspend fun coHandle(exchange: ServerWebExchange, ex: Throwable) |
||||
} |
||||
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
package org.springframework.web.server |
||||
|
||||
import org.assertj.core.api.Assertions.assertThat |
||||
import org.junit.jupiter.api.Test |
||||
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest |
||||
import org.springframework.web.testfixture.server.MockServerWebExchange |
||||
import reactor.test.StepVerifier |
||||
|
||||
class CoWebExceptionHandlerTest { |
||||
@Test |
||||
fun handle() { |
||||
val exchange = MockServerWebExchange.from(MockServerHttpRequest.get("https://example.com")) |
||||
val ex = RuntimeException() |
||||
|
||||
val handler = MyCoWebExceptionHandler() |
||||
val result = handler.handle(exchange, ex) |
||||
|
||||
StepVerifier.create(result).verifyComplete() |
||||
|
||||
assertThat(exchange.attributes["foo"]).isEqualTo("bar") |
||||
} |
||||
} |
||||
|
||||
private class MyCoWebExceptionHandler : CoWebExceptionHandler() { |
||||
override suspend fun coHandle(exchange: ServerWebExchange, ex: Throwable) { |
||||
exchange.attributes["foo"] = "bar" |
||||
} |
||||
} |
||||
Loading…
Reference in new issue