为何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
相关产品推荐
相关产品推荐

