Flux<Part>:未找到 class java.io.ByteArrayInputStream 的序列化程序
Flux<Part>: No serializer found for class java.io.ByteArrayInputStream
问题 https://jira.spring.io/si/jira.issueviews:issue-html/SPR-16350/SPR-16350.html seems to be closed. However, just following https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-multipart,我想,使用 @RequestBody
我应该能够以流的形式响应式读取多部分数据。
我尝试过的:
@PostMapping(
value = "/upload",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE
)
public Mono<Void> upload(@RequestBody Flux<Part> partFlux) {
return partFlux
.doOnError(error -> {
System.out.println(error);
System.out.println(error.getCause());
Arrays.asList(error.getStackTrace()).forEach(System.out::println);
})
.then();
}
经过简单测试(使用@AutoConfigureWebTestClient
):
@Test
public void uploadTest() throws Exception {
webTestClient
.post()
.uri("/upload")
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(
BodyInserters.fromMultipartData(
"file",
new MockMultipartFile
(
"file",
"test.txt",
"text/plain",
"test string".getBytes(StandardCharsets.UTF_8)
)
)
)
.exchange()
.expectStatus().isOk()
.expectBody()
.isEmpty();
}
这仍然给我带来与上述 jira 问题相同的错误。
我使用:AdoptJDK 11.0.3,Spring引导版本2.1.6
输出:
java.lang.RuntimeException: Request body input error
org.springframework.core.codec.CodecException: Type definition error: [simple type, class java.io.ByteArrayInputStream]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.springframework.mock.web.MockMultipartFile["inputStream"])
org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$FluxSinkAdapterListener.onError(SynchronossPartHttpMessageReader.java:232)
org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossPartGenerator.lambda$accept(SynchronossPartHttpMessageReader.java:165)
reactor.core.publisher.LambdaSubscriber.onError(LambdaSubscriber.java:119)
reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228)
reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228)
reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228)
reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228)
reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228)
reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onError(FluxContextStart.java:117)
reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:1748)
...
我认为您需要使用 MultipartBodyBuilder
构建请求,您可以在此处阅读更多信息:
问题 https://jira.spring.io/si/jira.issueviews:issue-html/SPR-16350/SPR-16350.html seems to be closed. However, just following https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-multipart,我想,使用 @RequestBody
我应该能够以流的形式响应式读取多部分数据。
我尝试过的:
@PostMapping(
value = "/upload",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE
)
public Mono<Void> upload(@RequestBody Flux<Part> partFlux) {
return partFlux
.doOnError(error -> {
System.out.println(error);
System.out.println(error.getCause());
Arrays.asList(error.getStackTrace()).forEach(System.out::println);
})
.then();
}
经过简单测试(使用@AutoConfigureWebTestClient
):
@Test
public void uploadTest() throws Exception {
webTestClient
.post()
.uri("/upload")
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(
BodyInserters.fromMultipartData(
"file",
new MockMultipartFile
(
"file",
"test.txt",
"text/plain",
"test string".getBytes(StandardCharsets.UTF_8)
)
)
)
.exchange()
.expectStatus().isOk()
.expectBody()
.isEmpty();
}
这仍然给我带来与上述 jira 问题相同的错误。
我使用:AdoptJDK 11.0.3,Spring引导版本2.1.6
输出:
java.lang.RuntimeException: Request body input error org.springframework.core.codec.CodecException: Type definition error: [simple type, class java.io.ByteArrayInputStream]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: org.springframework.mock.web.MockMultipartFile["inputStream"]) org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$FluxSinkAdapterListener.onError(SynchronossPartHttpMessageReader.java:232) org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossPartGenerator.lambda$accept(SynchronossPartHttpMessageReader.java:165) reactor.core.publisher.LambdaSubscriber.onError(LambdaSubscriber.java:119) reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228) reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228) reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228) reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228) reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onError(FluxPeekFuseable.java:228) reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onError(FluxContextStart.java:117) reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:1748) ...
我认为您需要使用 MultipartBodyBuilder
构建请求,您可以在此处阅读更多信息: