当我在 Spring boot V3 中开发一个新的反应式端点时,如下所示:
@RestController
@RequestMapping("/stats")
public class StatsController {
@PostMapping(
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
)
@ResponseStatus(OK)
public Flux<String> index(@RequestPart("file") Flux<FilePart> file) {
}
}
然后我对 SwaggerV3 进行了如下配置:
@Configuration
public class SwaggerConfig {
@Bean
public GroupedOpenApi storeOpenApi() {
String[] paths = { "/stats/**" };
return GroupedOpenApi
.builder()
.group("Dummy Description")
.pathsToMatch(paths)
.build();
}
@Bean
public OpenApiCustomizer customiseOpenApi() {
return openApi -> openApi.getPaths()
.forEach((path, pathItem) -> pathItem.readOperations().forEach(operation -> {
if (path.equals("/stats") && operation.getOperationId() != null && operation.getOperationId().equals("index")) {
RequestBody requestBody = new RequestBody()
.required(true)
.content(new Content().addMediaType("multipart/form-data",
new io.swagger.v3.oas.models.media.MediaType().schema(new Schema<>()
.type("object")
.addProperty("file", new Schema<>().type("string").format("binary"))
)
));
operation.setRequestBody(requestBody);
}
}));
}
}
在我的 pom.xml 中,我的依赖项列表如下:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
<version>2.6.0</version>
</dependency>
好的一面是,它在正常的 Spring Boot 运行中使用以下命令正常显示文件上传输入:
./mvnw spring-boot:run
在普通的本地 JVM v21 上
但是当我构建 GraalVM 并运行应用程序并检查相同的输入并发现它是文本而不是文件上传时,问题就出现了。
我们如何解决这个问题?
请注意,它是反应性的
springdoc-openapi-starter-webflux-ui
和 GraalVM
经过几个小时的搜索和销毁,
我找到了😂
我必须放置一个名为
的文件srs/main/resources/META-INF/native-image/reflect-config.json
这些内容:
[
{
"name": "org.springframework.http.codec.multipart.FilePart",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"allDeclaredFields": true
},
{
"name": "org.springframework.http.codec.multipart.FilePart[]",
"unsafeAllocated": true
}
]
万岁,终于成功了