Spring WebFlux выбрасывает тип «производитель» неизвестно, когда я возвращаю значение в теле ответа - PullRequest
0 голосов
/ 23 октября 2019

Я использую Spring Boot с Kotlin, и теперь пытаюсь получить значение состояния из службы GET restful, передав обработчик для реактивной службы.

Я вижу, что обработчик, который я передаю,в запросе, но всякий раз, когда я строю тело, я получаю это исключение:

java.lang.IllegalArgumentException: 'producer' type is unknown to ReactiveAdapterRegistry
    at org.springframework.util.Assert.notNull(Assert.java:198) ~[spring-core-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException

Вот мой код :

@Bean
    fun getReceiptConversionStatus() = router {
        accept(MediaType.APPLICATION_JSON).nest {
            GET("/BsGetStatus/{handler}", ::handleGetStatusRequest)
        }
    }
    private fun handleGetStatusRequest(serverRequest: ServerRequest): Mono<ServerResponse> = ServerResponse
            .ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(GetStatusViewmodel(fromObject(serverRequest.pathVariable("handler"))), GetStatusViewmodel::class.java)
            .switchIfEmpty(ServerResponse.notFound().build())

, и это мойViewmodel:

data class GetStatusViewmodel(
        @JsonProperty("handler") val documentHandler: String
)

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Я действительно решил это, и я опубликую это здесь на всякий случай, если кто-то сделает ту же ошибку, что и я :( Это была типичная ошибка для тех, кто работает с Java, это был неправильный импорт .

Я использовал метод fromObject() в своем приложении "Я обновил вопрос, чтобы он соответствовал моему фактическому коду" . Вы можете найти эту функцию в обоих из этих импортов, и я использовалодна из перегруженных body() функций для передачи этой неправильно размещенной функции:

//this is the wrong import I was using
import org.springframework.web.reactive.function.server.EntityResponse.fromObject
//this is the correct one for building the mono body
import org.springframework.web.reactive.function.BodyInserters.fromObject

Используя метод из BodyInserters, вы сможете передать fromObject(T) в метод body и он вернетмоно результат.

0 голосов
/ 24 октября 2019

Flux и Mono s Producers. Они производят вещи. Вы не передаете producer в теле, поэтому вы получаете ошибку, оно не распознает продюсера, которого вы передаете, потому что вы передаете GetStatusViewmodel.

Ваше тело должнобыть типа Mono<GetStatusViewmodel>. Вы можете либо заменить body на syncBody (он автоматически обернется для вас), либо вы можете обернуть GetStatusViewodel в Mono с помощью Mono#just перед передачей его в функцию body.

...