我们有一个基于 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());
}
但是没有成功。
在这里找到了解决方案:springdoc-openapi-ui无法渲染Protobuf模型导致浏览器崩溃。需要使用自定义 ObjectMapper 定义 ModelResolver bean。
结合 https://eternalwind.github.io/tech/2022/05/20/Making-springdoc-openapi-works-with-protobuf.html 和 https://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);
}
}