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 构建请求,您可以在此处阅读更多信息:

webflux-client-body-multipart