Как получить доступ к Mono <T> При обработке исключения с помощью onErrorMap ()?

В классе данных я определил, что «имя» должно быть уникальным для всей коллекции mongo:

@Document data class Inn(@Indexed(unique = true) val name: String, val description: String) { @Id var id: String = UUID.randomUUID().toString() var intro: String = "" } 

Поэтому при обслуживании я должен зафиксировать неожиданное исключение, если кто-то снова передает одно и то же имя.

 @Service class InnService(val repository: InnRepository) { fun create(inn: Mono<Inn>): Mono<Inn> = repository .create(inn) .onErrorMap( DuplicateKeyException::class.java, { err -> InnAlreadyExistedException("The inn already existed", err) } ) } 

Это нормально, но что, если я хочу добавить дополнительную информацию в исключительное сообщение типа "The inn named '$it.name' already existed" , что я должен сделать для преобразования исключения с обогащенным сообщением.

Ясно, что назначить Mono<Inn> локальной переменной в начале – это не очень хорошая идея …

Подобная ситуация в обработчике, я хотел бы предоставить клиенту больше информации, которая получена из настраиваемого исключения, но подходящий способ не найден.

 @Component class InnHandler(val innService: InnService) { fun create(req: ServerRequest): Mono<ServerResponse> { return innService .create(req.bodyToMono<Inn>()) .flatMap { created(URI.create("/api/inns/${it.id}")) .contentType(MediaType.APPLICATION_JSON_UTF8).body(it.toMono()) } .onErrorReturn( InnAlreadyExistedException::class.java, badRequest().body(mapOf("code" to "SF400", "message" to t.message).toMono()).block() ) } } 

В реакторе вы не будете иметь значение, которое вы хотите передать вам в onErrorMap в качестве аргумента, вы просто получите Throwable . Однако в Kotlin вы можете выйти за пределы обработчика ошибок и напрямую обратиться к inn . Вам не нужно много менять:

 fun create(inn: Mono<Inn>): Mono<Inn> = repository .create(inn) .onErrorMap( DuplicateKeyException::class.java, { InnAlreadyExistedException("The inn ${inn.name} already existed", it) } ) } 
Intereting Posts
Невозможно создать экземпляр активности | Причина: kotlin.KotlinNullPointerException Как распространять аргументы по умолчанию между функциями в Kotlin? Как вызвать конструктор String Java (char , int offset, int length) из Kotlin? Внесите Intellij IDE, выполнив обработку аннотации Kotlin / Java при изменении исходных файлов Kotlin Оператор == не может применяться к «Long» и «Int» в Kotlin Gradle. Котлин – возможно ли создать динамические задачи («на лету»)? Доступ к значению параметра по умолчанию для функции в Котлине android – Модифицировать вызов void с помощью Kotlin Почему некоторые файлы Kotlin показывают значок блокировки? Невозможно инициализировать парсер объектов для модели. Продукты, не найдены приемлемые конструкторы Кинжал не создает компонент для androidTest IntellJ IDEA Плагин Kotlin – «нет доступных конфигураторов» Настройка Jackson для использования SNAKE_CASE «глобально» в Spring Boot 2.0.0.M1 Имущество должно быть инициализировано или быть абстрактным Новое для Kotlin..have проблемы с опциями и литьем