package com.imyeyu.config; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.introspector.Property; import org.yaml.snakeyaml.nodes.NodeTuple; import org.yaml.snakeyaml.nodes.Tag; import org.yaml.snakeyaml.representer.Representer; /** * 自定义 Representer - SnakeYAML 序列化增强 * * * @author 夜雨 * @since 2026-01-12 12:02 */ public class ConfigRepresenter extends Representer { public ConfigRepresenter(DumperOptions options) { super(options); // null 值表示为空字符串 this.nullRepresenter = data -> representScalar(Tag.NULL, ""); // 枚举转字符串(不带类型标签) this.representers.put(Enum.class, data -> { Enum enumValue = (Enum) data; return representScalar(Tag.STR, enumValue.name()); }); } @Override protected NodeTuple representJavaBeanProperty(Object javaBean, Property property, Object propertyValue, Tag customTag) { // 跳过 null 值,保持 YAML 简洁 if (propertyValue == null) { return null; } return super.representJavaBeanProperty(javaBean, property, propertyValue, customTag); } @Override protected org.yaml.snakeyaml.nodes.MappingNode representJavaBean(java.util.Set properties, Object javaBean) { Class clazz = javaBean.getClass(); // 对于非 Java 标准库的类,使用 MAP 标签而不是类名标签 if (!clazz.getName().startsWith("java.") && !clazz.getName().startsWith("javax.")) { if (this.classTags.get(clazz) == null) { this.addClassTag(clazz, Tag.MAP); } } return super.representJavaBean(properties, javaBean); } }