尝试显示请求正文中包含原型 POJO 的端点时,Swagger UI 会卡住

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

我们有一个基于 java 19、spring boot 3.0.5 的 Web 应用程序,它有一个端点,该端点带有从 .proto 生成的 POJO 对象作为其 @RequestBody。我们通过 swagger ui 公开端点。 swagger ui 基于 springdoc 依赖项 -> 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'。当尝试在 swagger ui 中访问此特定端点时,浏览器会卡住并冻结。

具有完全相同配置但使用 String 作为 @RequestBody 的其他端点可以正常工作。当我们使用 springfox 作为 swagger ui 实现时,这个端点也工作得很好,但是 springfox 实现不适用于 spring boot 3。我们尝试使用以下方法覆盖 ProtobufJsonFormatHttpMessageConverter:

@Bean
public ProtobufJsonFormatHttpMessageConverter protobufHttpMessageConverter() {
    return new          ProtobufJsonFormatHttpMessageConverter(JsonFormat.parser().ignoringUnknownFields(),
            JsonFormat.printer().omittingInsignificantWhitespace());
} 

但是没有成功。

java spring-boot protocol-buffers swagger-ui springdoc-openapi-ui
2个回答
0
投票

在这里找到了解决方案:springdoc-openapi-ui无法渲染Protobuf模型导致浏览器崩溃。需要使用自定义 ObjectMapper 定义 ModelResolver bean。


0
投票

结合 https://eternalwind.github.io/tech/2022/05/20/Making-springdoc-openapi-works-with-protobuf.htmlhttps://github.com/innogames/springfox-原型缓冲区

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hubspot.jackson.datatype.protobuf.ProtobufModule;
import io.swagger.v3.core.jackson.ModelResolver;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@OpenAPIDefinition(
        info = @Info(title = "Server API", version = "v1")
)
public class SwaggerConfig {
    @Bean
    public ModelResolver modelResolver(final ObjectMapper objectMapper) {
        objectMapper.registerModule(new ProtobufModule());
        return new ModelResolver(objectMapper);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.