Java生成Docker镜像YAML配置文件:links结构问题求助
问题分析与解决方案:Java生成Docker镜像YAML配置的links结构错误
问题概述
用Java实现自动化生成Docker镜像的YAML配置文件,大部分内容生成正常,但links部分结构不符合预期,需要调整数据结构并修正代码错误。
预期生成的YAML结构
name: srlceos01 topology: nodes: srl: kind: nokia_srlinux image: ghcr.io/nokia/srlinux ceos: kind: ceos image: ceos:4.25.0F links: - endpoints: ["srl:e1-1", "ceos:eth1"]
当前生成的错误YAML结果
!!xx.xx.xx.bean.Container (Unwanted and wanted to remove) links: linkArray: - endpoints: - endpoints: - srl:e1-1 - ceos:eth1 - null - null - null - null name: srlceos01 topology: srl: image: ghcr.io/nokia/srlinux kind: nokia_srlinux
代码错误分析
- 实体类层级冗余:原本定义的
LinksArray、Links、Endpoint类嵌套过多,导致生成的YAML出现多余的linkArray和多层嵌套的endpoints,完全不符合预期结构。 - topology结构缺失层级:预期YAML中
topology下有nodes节点,但当前Container类的topology直接存储节点Map,缺少nodes这一层。 - Links数组初始化错误:创建了长度为5的
Links数组,其中4个元素为null,导致生成的YAML出现多余的null条目。 - SnakeYAML默认输出类标签:默认会输出实体类的全限定名(如
!!xx.xx.xx.bean.Container),需要手动禁用该特性。
修正后的代码实现
1. 修正实体类结构
// 主容器类 public class Container { private String name; private Topology topology; private List<Link> links; // 省略getter、setter方法 } // 拓扑类,包含nodes节点层级 public class Topology { private Map<String, Nodes> nodes; // 省略getter、setter方法 } // 链接类,直接存储端点字符串列表 public class Link { private List<String> endpoints; // 省略getter、setter方法 } // 节点类保持原有结构 public class Nodes { private String kind; private String image; // 省略getter、setter方法 }
2. 修正YAML生成逻辑
@Component public class GenerateYamlFile { Logger logger = LogManager.getLogger(GenerateYamlFile.class); public void createYamlFile() { Container container = new Container(); container.setName("srlceos01"); // 构建拓扑与节点数据 Topology topology = new Topology(); Map<String, Nodes> nodesMap = new LinkedHashMap<>(); // 添加srl节点 Nodes srlNode = new Nodes(); srlNode.setImage("ghcr.io/nokia/srlinux"); srlNode.setKind("nokia_srlinux"); nodesMap.put("srl", srlNode); // 添加ceos节点 Nodes ceosNode = new Nodes(); ceosNode.setImage("ceos:4.25.0F"); ceosNode.setKind("ceos"); nodesMap.put("ceos", ceosNode); topology.setNodes(nodesMap); container.setTopology(topology); // 构建links数据 List<Link> links = new ArrayList<>(); Link link = new Link(); link.setEndpoints(Arrays.asList("srl:e1-1", "ceos:eth1")); links.add(link); container.setLinks(links); GenerateYamlFileImpl yamlService = new GenerateYamlFileImpl(); yamlService.writeYamlfile(container); } }
3. 修正YAML生成服务(禁用类标签)
@Service public class GenerateYamlFileImpl { public void writeYamlfile(Container yamlConfig) { DumperOptions dpo = new DumperOptions(); dpo.setDefaultFlowStyle(FlowStyle.BLOCK); // 指定根类构造器,禁用类标签输出 Yaml yaml = new Yaml(new Constructor(Container.class), dpo); System.out.println(yaml.dump(yamlConfig)); } }
修正后生成的YAML结果
name: srlceos01 topology: nodes: srl: kind: nokia_srlinux image: ghcr.io/nokia/srlinux ceos: kind: ceos image: ceos:4.25.0F links: - endpoints: ["srl:e1-1", "ceos:eth1"]
内容的提问来源于stack exchange,提问作者BEdits
相关产品推荐
相关产品推荐

