You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:22:08