alieksie
02/11/2019, 11:17 AM@PostMapping(SEARCH_ROUTE)
fun search(@RequestBody searchQuery: SearchQuery): Mono<SearchQuery> = searchService.save(searchQuery)
save(searchQuery)
returns Mono<SearchQuery>.
When i return Mono.just(searchQuery), there are no issues. But when i return someMono.flatMap { ... }
I am getting an error: ...SearchQuery cannot be cast to class java.lang.String
Are there any tricks, or i miss something, when i use .flatMap
? 🙂Czar
02/11/2019, 12:32 PMflatMap
? And where are you trying to return the result of it? Are you returning it from SearchService#save(searchQuery: SearchQuery)
?Czar
02/11/2019, 12:41 PMMono<Something>
, you have to make sure that the result of the expression(s) between the curly braces of the flatMap
to be Mono<Something>
. If you do not want to construct Mono
inside flatMap
, use map
instead.
E.g.
class SearchQuery
class SearchQueryPrecursor {
fun toSearchQuery() : SearchQuery = SearchQuery()
}
class SearchService {
fun save1(searchQuery: SearchQuery): Mono<SearchQuery> =
Mono.just(SearchQueryPrecursor().toSearchQuery())
fun save2(searchQuery: SearchQuery): Mono<SearchQuery> =
Mono.just(SearchQueryPrecursor()).flatMap { Mono.just(it.toSearchQuery()) }
fun save3(searchQuery: SearchQuery): Mono<SearchQuery> =
Mono.just(SearchQueryPrecursor()).map { it.toSearchQuery() }
}
alieksie
02/11/2019, 12:42 PMSearchService#save(searchQuery: SearchQuery)
i am returning:
// Mono<Boolean>
return caches.searchQuery.store(cacheKey, preparedQuery).flatMap {
result ->
if (!result) {
Mono.error(ErrorSavingSearchQuery("Cannot save query: ${preparedQuery.buildQueryString()}"))
} else {
Mono.just(preparedQuery)
}
}
Czar
02/11/2019, 12:43 PMMono.just(preparedQuery)
, where preparedQuery
is probably a String
, while you specified the expected result to be a Mono<SearchQuery>
alieksie
02/11/2019, 12:44 PMpreparedQuery
is the instance of SearchQuery
alieksie
02/11/2019, 12:44 PMalieksie
02/11/2019, 12:45 PMreturn Mono.just(preparedQuery)
before the flatMap
, everything works fine 😕alieksie
02/11/2019, 12:46 PMMonoFlatMap
object, maybe later internally something weird happens inside the Spring frameworkalieksie
02/11/2019, 12:47 PMCzar
02/11/2019, 1:00 PMimport reactor.core.publisher.Mono
class SearchQuery {
override fun toString(): String = "A Test"
fun buildQueryString() = "ZZZ"
}
class ErrorSavingSearchQuery(message: String) : Throwable(message)
class SearchService {
fun save(searchQuery: SearchQuery): Mono<SearchQuery> {
val preparedQuery: SearchQuery = SearchQuery()
return Mono.just(true).flatMap { result ->
if (!result) {
Mono.error(ErrorSavingSearchQuery("Cannot save query: ${preparedQuery.buildQueryString()}"))
} else {
Mono.just(preparedQuery)
}
}
}
}
fun test() {
val result: Mono<SearchQuery> = SearchService().save(searchQuery = SearchQuery())
result.doOnSuccess {
println("Hi, it's $it")
}.subscribe()
}
test()
It prints
Hi, it's A Test
alieksie
02/11/2019, 1:01 PMalieksie
02/11/2019, 1:02 PMcaches.searchQuery.store
calls ReactiveRedisTemplate.opsForValue().set()
, which actually returns MonoDefer
Czar
02/11/2019, 1:03 PMalieksie
02/11/2019, 1:03 PMMono<Boolean>
in the endalieksie
02/11/2019, 1:03 PMMono<Boolean> set(K key, V value);
alieksie
02/11/2019, 1:03 PMalieksie
02/11/2019, 1:03 PMalieksie
02/11/2019, 2:17 PM