programing

응답 본문에 값을 반환할 때 Spring WebFlux가 'producer' 유형을 알 수 없음

muds 2023. 4. 1. 10:05
반응형

응답 본문에 값을 반환할 때 Spring WebFlux가 'producer' 유형을 알 수 없음

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())

이것이 뷰 모델입니다.

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

Flux그리고.Monos는Producers그들은 물건을 생산한다.당신은 통과하지 않을 것이다.producer본문에서는, 에러가 발생하는 이유는, 당신이 패스하고 있는 프로듀서를 인식하지 않기 때문입니다.왜냐하면 당신이 패스하고 있기 때문입니다.GetStatusViewmodel.

당신의 몸은 타입이 되어야 한다.Mono<GetStatusViewmodel>를 교환할 수 있습니다.body와 함께bodyValue(자동으로 포장됩니다) 또는 포장할 수 있습니다.GetStatusViewodel에 있어서Mono사용.Mono#just에 전달하기 전에body기능.

저는 이런 걸 하고 있었어요

webClient.post()
    .uri("/some/endpoint")
    .body(postRequestObj, PostRequest.class) // erroneous line 
    .accept(MediaType.APPLICATION_JSON)
    .retrieve()
    .bodyToMono(PostResponse.class)
    .timeout(Duration.ofMillis(5000))

해당 기능에 대한 스프링 문서를 볼 때body()다음과 같이 설명하겠습니다.

Variant of body(Publisher, Class) that allows using any producer that can be resolved to Publisher via ReactiveAdapterRegistry.

Parameters:
     producer - the producer to write to the request
     elementClass - the type of elements produced

Returns:
    this builder

번째 파라미터는 어떤 오브젝트도 될 수 없습니다.프로듀서여야 돼요위의 코드를 변경하여 오브젝트를 모노로 감싸면 이 문제가 해결되었습니다.

webClient.post()
    .uri("/some/endpoint")
    .body(Mono.just(postRequestObj), PostRequest.class)
    .accept(MediaType.APPLICATION_JSON)
    .retrieve()
    .bodyToMono(PostResponse.class)
    .timeout(Duration.ofMillis(5000))

레퍼런스: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.RequestBodySpec.html

실제로 해결했습니다만, 만약 누군가가 저와 같은 실수를 할 경우를 대비해서 여기에 투고하겠습니다. (Java를 사용하는 사람들에게는 전형적인 실수이며, 잘못된 Import였습니다.

사용하고 있었습니다.fromObject()어플리케이션의 method "실제 코드와 일치하도록 질문을 업데이트했습니다."이 기능은 양쪽 Import에서 찾을 수 있습니다.저는 과부하 중 하나를 사용하고 있었습니다.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)신체 방법으로 변환하면 모노 결과가 반환됩니다.

지정된 코드로 문제가 해결되었습니다.

public Mono<ServerResponse> getName(ServerRequest request) {

    return ServerResponse.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .bodyValue(birthday);

}

언급URL : https://stackoverflow.com/questions/58519036/spring-webflux-throws-producer-type-is-unknow-when-i-return-value-in-the-respo

반응형