【发布时间】:2025-12-17 04:00:01
【问题描述】:
我有获取ServerRequest 然后将其转换为WebClient 并将其代理到目的地的组件。
请求的Content-Type为multipart/form-data
return getBody(request)
.flatMap { body ->
WebClient.builder()
.baseUrl(path)
.defaultCookies { x ->
request.cookies()
.forEach { (k, v) -> x[k] = v.map { it.value } }
}
.defaultHeaders { x ->
request.headers().asHttpHeaders()
.forEach { (k, v) -> x[k] = v }
}
.defaultUriVariables(request.queryParams())
.build()
.method(request.method() ?: HttpMethod.GET)
.body(body)
.exchange()
}
private fun getBody(request: ServerRequest): Mono<BodyInserter<*, in ClientHttpRequest>> {
return request.multipartData()
.filter { it.isNotEmpty() }
.map<BodyInserter<*, in ClientHttpRequest>> { multipart ->
BodyInserters.fromMultipartData(multipart)
}
.switchIfEmpty(Mono.fromCallable {
val body = request.bodyToMono(String::class.java)
BodyInserters.fromPublisher(body, String::class.java)
})
}
我遇到了多部分请求的问题:尝试使用多部分创建正文以将其发送到目的地时失败。
我有以下配置:
@Configuration
open class SwitcherMultipartConfigurer : WebFluxConfigurer {
override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
configurer.customCodecs().reader(
MultipartHttpMessageReader(SynchronossPartHttpMessageReader())
)
configurer.customCodecs().writer(
MultipartHttpMessageWriter(
)
)
}
}
它可以是什么?错误是:
observed an error org.springframework.core.codec.CodecException: No suitable writer found for part: file
| 2019-06-25T13:33:49.069006743Z at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.encodePart(MultipartHttpMessageWriter.java:300)
| 2019-06-25T13:33:49.069013261Z at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.lambda$encodePartValues$4(MultipartHttpMessageWriter.java:253)
| 2019-06-25T13:33:49.069018616Z at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
| 2019-06-25T13:33:49.069023613Z at java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1235)
| 2019-06-25T13:33:49.069028522Z at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
| 2019-06-25T13:33:49.069033432Z at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
| 2019-06-25T13:33:49.069038361Z at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
| 2019-06-25T13:33:49.069043368Z at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
| 2019-06-25T13:33:49.069048212Z at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
| 2019-06-25T13:33:49.069053089Z at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.encodePartValues(MultipartHttpMessageWriter.java:253)
| 2019-06-25T13:33:49.069058115Z at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.lambda$writeMultipart$3(MultipartHttpMessageWriter.java:234)
【问题讨论】:
-
我不太擅长阅读 Kotlin,但在阅读了一些文档后,我认为
request.multipartData()不是正确的选择。文档状态:ServerWebExchange exposes the following method for access to multipart data: Mono<MultiValueMap<String, Part>> getMultipartData(); The DefaultServerWebExchange uses the configured HttpMessageReader<MultiValueMap<String, Part>> to parse multipart/form-data content into a MultiValueMap.我看不到您如何访问请求对象,但也许可以尝试ServerWebExchange#getMultipartData() -
@ThomasAndolf 我在这里通过调用
request.multipartData()访问请求,其中请求是ServerRequest的实例。
标签: java kotlin multipartform-data spring-webflux