Асинхронное выполнение в WebFilter - PullRequest
0 голосов
/ 04 октября 2018

Как я могу вызвать метод, который возвращает Mono <> и использовать его для вызова самого веб-метода?

@Component
class SampleWebFilter(private val sampleService: SampleService) : WebFilter {
     override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
        val accessToken =
            exchange.request.headers["Authorization"]?.firstOrNull()
                    ?: throw IllegalArgumentException("Access token must not be empty")

        val res = sampleService.authorize(accessToken)

        val id = res.block()?.userId

        exchange.attributes["UserId"] = userId
        return chain.filter(exchange)
    }
}

@Component
interface SampleService {
    @GET("/user")
    fun authorize(accessToken): Mono<User>
}

приведенный выше код выдает исключение block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2

Я знаю, что мы не должныне блокировать поток в netty, но как я могу использовать id из SampleService для вызова веб-метода.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 октября 2018
@Component
class SampleWebFilter(private val sampleService: SampleService) : WebFilter {
 override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
    val accessToken =
        exchange.request.headers["Authorization"]?.firstOrNull()
                ?: throw IllegalArgumentException("Access token must not be empty")

    val res = sampleService.authorize(accessToken)

    return res.doOnNext {
        exchange.attributes["UserId"] = userId
    }
    .then(chain.filter(exchange))
}}

@Component
interface SampleService {
    @GET("/user")
    fun authorize(accessToken): Mono<User>
}

Я решил проблему написания, как указано выше.

...