如何修改Castor XML映射实现用户节点嵌套结构?
没问题,咱们一步步来调整你的Java模型和Castor映射文件,适配新的XML结构:
1. 修改Java模型类
首先要调整类结构,贴合新的XML层级:
重命名原Users类为User
原来的Users类对应现在单个用户的<User>节点,重命名后更符合语义:
package com.cetrea.securityservice.bean; public class User { private String username; private String password; // Getters & Setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
创建新的Users容器类
这个类作为外层<Users>节点的对应类,用来包裹所有User对象的列表:
package com.cetrea.securityservice.bean; import java.util.List; public class Users { private List<User> userList; // Getter & Setter public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } }
更新Configurations类
把原来的List<Users>字段替换为单个Users对象,对应XML中唯一的外层<Users>节点:
package com.cetrea.securityservice.bean; public class Configurations { private int port; private boolean enableHttps; private String keyStorePath; private String keyPass; private int TTL; private Users users; // 替换原List<Users>为单个Users容器 // Getters & Setters public int getPort() { return port; } public void setPort(int port) { this.port = port; } public boolean isEnableHttps() { return enableHttps; } public void setEnableHttps(boolean enableHttps) { this.enableHttps = enableHttps; } public String getKeyStorePath() { return keyStorePath; } public void setKeyStorePath(String keyStorePath) { this.keyStorePath = keyStorePath; } public String getKeyPass() { return keyPass; } public void setKeyPass(String keyPass) { this.keyPass = keyPass; } public int getTTL() { return TTL; } public void setTTL(int TTL) { this.TTL = TTL; } public Users getUsers() { return users; } public void setUsers(Users users) { this.users = users; } }
2. 修改Castor映射文件
现在调整映射配置,让Castor能正确解析新的XML结构:
<mapping> <class name="com.cetrea.securityservice.bean.Configurations" auto-complete="true"> <map-to xml="Configurations"/> <field name="port" type="int"> <bind-xml name="Port" node="element"/> </field> <field name="enableHttps" type="boolean"> <bind-xml name="EnableHttps" node="element"/> </field> <field name="keyStorePath" type="string"> <bind-xml name="KeyStorePath" node="element"/> </field> <field name="keyPass" type="string"> <bind-xml name="KeyPass" node="element"/> </field> <field name="TTL" type="int"> <bind-xml name="TokenTtlMillis" node="element"/> </field> <!-- 映射到新的Users容器类,对应外层<Users>节点 --> <field name="users" type="com.cetrea.securityservice.bean.Users"> <bind-xml name="Users" node="element"/> </field> </class> <!-- 配置Users容器类的映射,解析内部的<User>节点列表 --> <class name="com.cetrea.securityservice.bean.Users" auto-complete="true"> <map-to xml="Users"/> <field name="userList" collection="arraylist" type="com.cetrea.securityservice.bean.User"> <bind-xml name="User" node="element"/> </field> </class> <!-- 配置单个User类的映射,对应<User>节点 --> <class name="com.cetrea.securityservice.bean.User" auto-complete="true"> <map-to xml="User"/> <field name="username" type="string"> <bind-xml name="Username" node="element"/> </field> <field name="password" type="string"> <bind-xml name="Password" node="element"/> </field> </class> </mapping>
关键修改说明
- 原
Users类的职责拆分:现在User对应单个用户节点,Users作为容器包裹多个用户,完美匹配新XML的<Users>-><User>层级。 Configurations中的字段从列表改为单个容器对象,对应XML中唯一的外层<Users>节点。- 映射文件中给
Users类的userList字段配置collection="arraylist",绑定到<User>节点,Castor会自动把所有<User>节点解析为User对象的列表。
内容的提问来源于stack exchange,提问作者Mike Nor
相关产品推荐
相关产品推荐

