Swagger API V3 中的 GraalVM 本机构建中的文件上传显示文本输入而不是文件上传

问题描述 投票:0回答:1

当我在 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

spring-boot swagger spring-webflux swagger-ui reactive
1个回答
0
投票

经过几个小时的搜索和销毁,

我找到了😂

我必须放置一个名为

的文件

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
  }
]

万岁,终于成功了

© www.soinside.com 2019 - 2024. All rights reserved.