응답 본문에 값을 반환할 때 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
그리고.Mono
s는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
'programing' 카테고리의 다른 글
AngularJS에서 디렉티브를 동적으로 추가하려면 어떻게 해야 합니까? (0) | 2023.04.01 |
---|---|
Grunt를 사용하는 동안 '카르마' 모듈을 찾을 수 없습니다. (0) | 2023.04.01 |
미검출(약속) 제공된 요소가 문서 내에 없습니다. (0) | 2023.04.01 |
가장 우아한 방법으로 팝업 표시 (0) | 2023.04.01 |
Azure 계정 이름과 계정 키는 어디서 찾을 수 있나요? (0) | 2023.04.01 |