设为首页 收藏本站
查看: 526|回复: 0

[经验分享] apache commons configuration 学习(三)

[复制链接]

尚未签到

发表于 2017-1-3 11:29:49 | 显示全部楼层 |阅读模式
  前面的学习让我们学会了如何通过configuration框架来读取配置文件,但是还有一个重要的内容没有学习,就是如何来更新配置文件里面的值呢?Configuration接口提供了一个setProperty(String key,Object value)的方法供我们调用,这个方法看起来简单,明了,但是,如果你没有去认真测试一番的话,这里面包含了很多的地雷哦~!不相信?就让我们来看一些例子:
  database.xml:

<?xml version="1.0" encoding="UTF-8"?>
<database>
<tables>
<table tableType="system">
<name>name</name>
<fields>
<field>
<name>uid</name>
<type>long,short</type>
</field>
<field>
<name>email</name>
<type>java.lang.String</type>
</field>
</fields>
</table>
<table tableType="application">
<name>documents</name>
<fields>
<field>
<name>docid</name>
<type>long</type>
</field>
<field>
<name>creationDate</name>
<type>java.util.Date</type>
</field>      
</fields>
</table>
</tables>
</database>

  然后我想干什么呢?我想把第一个table下的name元素的值改为changed_name,我采取这样的方法:

XMLConfiguration config = new XMLConfiguration("database.xml");
// 设置修改自动提交
config.setAutoSave(true);
config.setProperty("tables.table(0).name", "changed_name");
  OK,没问题,我看到name已经变为了“changed_name”,蛮不错的!千万别高兴得太早,不知道你注意到了没有,在database.xml文件中有一个配置:<type>long,short</type>,经过以上的操作后,竟然被分解成了两个“<type>”标签,就像下面的一样:

......
<type>long</type>
<type>short</type>
......
  这可真够恼人的,改一个属性竟然把文件的结构都改变了,那还不得出大问题!什么原因?原来Configuration框架对于一个配置项中的元素,如果是用“,”分隔的,它会把他们加载成为一个List,像上面的type配置,long和short是以“,”分隔的,configuration把他们认为是两个标签type(0)和type(1),而更新的时候它则把所有的List还原成xml标签了!怎么办?没问题,只需要调用XMLConfiguration.setsetDefaultListDelimiter()方法就行了,这是一个静态方法,这个方法一定要在加载配置文件之前调用,否则不会起作用。

// 这一行代码必须在下面一行代码前,否则不会起作用
XMLConfiguration.setDefaultListDelimiter('/');
XMLConfiguration xmlConfig = new XMLConfiguration("database.xml");
xmlConfig.setAutoSave(true);
......
  如果你觉得这样子看起来不太舒服,还有另外一种方式:

// 使用空的构造函数
XMLConfiguration config = new XMLConfiguration();
// 设置配置分割符,需要在加载之前调用
config.setListDelimiter('/');
config .setAutoSave(true);
config .setFileName("database.xml");
config .load();
......
  配置了默认的List分割符之后,第一个地雷被我们挖走了。
  第二个地雷,上面的配置文件第一个table下只有一个直接的name子元素,如果2个、3个或是n个呢?这样的话,当你进行更新操作时,Configuration会无情的把后面的全部cut掉,所以你必须指定序号,像这样:

config.setProperty("tables.table(0).name(0)", "changed_name");
  添加元素的时候也是一样,首先需要配置好配置了默认的List分割符,不要与你添加元素中含有的符号重合了,否则会被添加多个元素。xml配置文件添加元素基本操作:

// 在第一个table下添加Addr标签,并添加provice和city子标签
// 索引(-1)总是会在上级元素末尾创建新元素,而没有索引时会指向最后一个元素
config.addProperty("tables.table(0).Addr(-1).province", "Guangdong");
config.addProperty("tables.table(0).Addr.city", "Shenzhen");
  更新后的database.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<database>
<tables>
<table tableType="system">
<name>changed_name</name>
<fields>
......
</fields>
<Addr>
<province>Guangdong</province>
<city>Shenzhen</city>
</Addr>
</table>
<table tableType="application">
......
</table>
</tables>
</database>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323233-1-1.html 上篇帖子: apache启动命令 下篇帖子: apache 伪静态BUG?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表