Как условно установить код состояния на HTTP-сервере Project Reactor Netty?

Я подозреваю, что мне здесь не хватает чего-то действительно очевидного, но я не могу понять, как достичь очень простого варианта использования HttpServer в response-netty.

По сути, я хочу реализовать возможность отвечать 200 OK, когда объект ответа не равен нулю, и 404 Not Found, когда объект ответа равен нулю.

Я использую Kotlin и добавляю функцию расширения в HttpServerResponse для сопоставления объекта с JSON:

fun <T> HttpServerResponse.sendObjectAsJson(obj: Mono<T?>, mapper: (T) -> JsonObject): NettyOutbound {
    val jsonString = obj.map { mapper(it!!) }.map { it.toString() }
    return this
       .status(OK)
       .header(CONTENT_TYPE, "application/json")
       .sendString(jsonString)
    }
}

Этот код в настоящее время не работает, если исходный объект равен нулю (из-за использования it!!). На самом деле я хочу переключить код состояния ответа и не отправлять строковое содержимое, если исходный объект имеет значение NULL. Но я просто не могу понять, как переключить поведение в зависимости от содержимого Mono<T?>.

Любая помощь приветствуется!


person DrewEaster    schedule 26.07.2019    source источник
comment
Я не использую Kotlin, но, как предположение при переводе, не могли бы вы переключить первую строку в функции на что-то вроде val jsonString = obj.map { it?.toString() }, затем использовать .status(if (jsonString == null) OK else OTHER_STATUS_CODE) для кода состояния и .sendString(jsonString ?: "") для тела ответа?   -  person Michael Berry    schedule 26.07.2019
comment
Спасибо за идею. Проблема - которую я плохо сформулировал - заключается в том, что вы не можете выполнить вторую строку кода, потому что jsonString будет Mono ‹String?›, А не просто String? Это корень моего замешательства и почему мне не кажется очевидным подход   -  person DrewEaster    schedule 27.07.2019


Ответы (1)


Мне удалось решить аналогичную проблему с помощью следующего кода

Mono<String> valueMono = Mono.from(...).doOnSuccess(s -> {
  if (s == null) {
    response.status(HttpResponseStatus.NOT_FOUND);
  }
});
return response.sendString(valueMono);

person Andrey Fomin    schedule 02.12.2019