如何在Quarkus中配置OpenAPI YAML文件的最大大小?
问题
使用Quarkus的quarkus-smallrye-openapi扩展生成的OpenAPI文档体积过大,在Swagger UI查看时抛出以下错误:
Caused by: com.fasterxml.jackson.dataformat.yaml.JacksonYAMLParseException: The incoming YAML document exceeds the limit: 3145728 code points. at [Source: (InputStreamReader); line: 87426, column: 100] at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:456) at com.fasterxml.jackson.core.JsonParser.nextFieldName(JsonParser.java:1151) at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer._deserializeContainerNoRecursion(JsonNodeDeserializer.java:539) at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:100) at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:25) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) at com.fasterxml.jackson.databind.ObjectMapper._readTreeAndClose(ObjectMapper.java:4959) at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:3270) at io.smallrye.openapi.runtime.io.JacksonJsonIO.fromReader(JacksonJsonIO.java:293) ... 76 more Caused by: org.yaml.snakeyaml.error.YAMLException: The incoming YAML document exceeds the limit: 3145728 code points. at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:317) at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:238) at org.yaml.snakeyaml.parser.ParserImpl$ParseFlowMappingKey.produce(ParserImpl.java:889) at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:162) at org.yaml.snakeyaml.parser.ParserImpl.getEvent(ParserImpl.java:172) at com.fasterxml.jackson.dataformat.yaml.YAMLParser.getEvent(YAMLParser.java:590) at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:450) ... 84 more
已知可通过配置SnakeYAML的LoaderOptions调整最大文件大小限制,示例代码如下:
LoaderOptions loadingConfig = new LoaderOptions(); loadingConfig.setCodePointLimit(maxYamlCodePointSize); Yaml yaml = new Yaml(loadingConfig);
需实现:在使用quarkus-smallrye-openapi的Quarkus应用中,如何配置该SnakeYAML限制?
解决方案
可通过以下方式配置SnakeYAML的代码点限制,解决OpenAPI文档过大导致的解析错误:
方法一:自定义Jackson YAML ObjectMapper
创建CDI单例Bean,自定义Jackson的YAML ObjectMapper并配置LoaderOptions:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import io.quarkus.jackson.ObjectMapperCustomizer; import jakarta.inject.Singleton; import org.yaml.snakeyaml.LoaderOptions; @Singleton public class YamlObjectMapperCustomizer implements ObjectMapperCustomizer { @Override public void customize(ObjectMapper objectMapper) { // 设置更大的代码点限制,示例为10MB(约10*1024*1024=10485760) LoaderOptions loaderOptions = new LoaderOptions(); loaderOptions.setCodePointLimit(10485760); // 替换ObjectMapper的YAMLFactory为配置好的版本 YAMLFactory yamlFactory = YAMLFactory.builder() .loaderOptions(loaderOptions) .build(); objectMapper.setFactory(yamlFactory); } }
Quarkus会自动发现该Bean并应用到全局Jackson ObjectMapper中,SmallRye OpenAPI处理YAML时会使用此自定义配置,突破默认3MB限制。
方法二:扩展SmallRye OpenAPI的IO处理器
若需精准控制SmallRye OpenAPI的YAML解析逻辑,可自定义OpenApiParser或扩展JacksonJsonIO的行为,但此方式复杂度较高,多数场景下方法一已足够解决问题。
验证配置
重启Quarkus应用后,访问默认路径/q/swagger-ui,若原错误消失则配置生效。
内容的提问来源于stack exchange,提问作者user1340123
相关产品推荐
相关产品推荐

