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

为何YAMLGenerator未按配置决定是否关闭流?

YAMLGenerator忽略AUTO_CLOSE_TARGET等配置的问题

当我们使用YAMLFactory创建ObjectMapper时,通常会尝试配置一些和资源关闭相关的参数来控制流的生命周期,比如:

ObjectMapper o = new ObjectMapper(new YAMLFactory());
// 尝试关闭自动关闭目标流的特性
o.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
// 或者启用关闭Closeable的特性
o.enable(SerializationFeature.CLOSE_CLOSEABLE);

但实际运行后会发现,这些配置完全被YAMLGenerator忽略了。看看它的close()方法实现就能明白原因:

@Override
public void close() throws IOException {
    if (!isClosed()) {
        _emitter.emit(new DocumentEndEvent(null, null, false));
        _emitter.emit(new StreamEndEvent(null, null));
        super.close();
        _writer.close();
    }
}

这段代码里直接硬调用了_writer.close(),完全没考虑AUTO_CLOSE_TARGET的配置,也没检查是否应该由生成器来管理目标资源——不管你怎么配置,底层写入器都会被强制关闭。

但讽刺的是,YAMLGenerator.close()的Javadoc里明确说明了预期的行为逻辑:

void com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.close() throws IOException

用于关闭生成器,使其无法再写入内容的方法。

底层目标(流、写入器)是否关闭取决于生成器是否管理目标(即唯一有权访问目标的对象——例如调用者传入File而非流的情况),或者是否启用了Feature.AUTO_CLOSE_TARGET特性。若满足任一条件,则目标也会被关闭;否则(不管理目标且未启用特性),目标不会被关闭。

很明显,实际代码的实现和Javadoc描述的逻辑完全不一致,这就导致我们的配置根本起不到作用。

内容的提问来源于stack exchange,提问作者hudi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:48