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

[经验分享] 关于Apache betwixt组件的使用

[复制链接]

尚未签到

发表于 2017-1-7 06:54:30 | 显示全部楼层 |阅读模式
最近研究了一下公司的底层框架的实现,发现公司对自定义的XML转换为javabean使用了apache betwixt组件,于是乎,就研究了一下,发现这个组件挺强大的。
环境准备:
必不可少的四个jar包
commons-betwixt.jar
commons-degester.jar
commons-collections.jar
commons-beanutils.jar
这里简单的例子就直接去apache的官网上看吧,这里介绍一下实战型复杂的用法.
以下是三个javaBean的代码:

public class SysCfgModule implements Serializable {
public SysCfgModule()
{
requests=new ArrayList();
}
public List getRequests() {
return requests;
}
//一定要有这个add方法,否则会抱警告,无法创建java.util.list对象,因为我们是采用的add方法,将xml中的单个request添加到requests中
public void addRequest(SysCfgRequest request)
{
requests.add(request);
}
public String getMessageKey() {
return messageKey;
}
public void setMessageKey(String messageKey) {
this.messageKey = messageKey;
}
public String getUrlPrefix() {
return urlPrefix;
}
public void setUrlPrefix(String urlPrefix) {
this.urlPrefix = urlPrefix;
}
public String getRoles() {
return roles;
}
public void setRoles(String roles) {
this.roles = roles;
}
public String getDefaultValidator() {
return defaultValidator;
}
public void setDefaultValidator(String
defaultValidator) {
this.defaultValidator = defaultValidator;
}
private static Log logger = LogFactory.getLog(SysCfgModule.class);
private String messageKey;
private String urlPrefix;
private String roles;
private String defaultValidator;
private List requests;
}


public class SysConfigs {
//这里面不要对addModule重载,否则会有问题。
public void addModule(SysCfgModule newModule) throws Exception {
// System.out.println(newModule);
System.out.println("1111");
System.out.println(newModule.getDefaultValidator());
System.out.println(newModule.getRequests().size());
}
public void addModule() throws Exception {
System.out.println("-------------");
}
//public void addModule(String type) throws Exception {
//System.out.println("hello ");
//System.out.println(type);
//}

}



public class SysCfgRequest {
private String path;
private String validatorParameter;
private String defaultValidator;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getValidatorParameter() {
return validatorParameter;
}
public void setValidatorParameter(String validatorParameter) {
this.validatorParameter = validatorParameter;
}
public String getDefaultValidator() {
return defaultValidator;
}
public void setDefaultValidator(String defaultValidator) {
this.defaultValidator = defaultValidator;
}
}

然后再看我们的design.xml是如何定义的:

<configs xmlns="http://www.example.org/design-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/design-config ../../design.xsd ">
<module messageKey="km-answer:home.nav.kmAnswer" urlPrefix="/km/answer/"
defaultValidator="roleValidator(role=ROLE_KMANSWER_DEFAULT)">
<request
path="km_doc_template/kmDocTemplate*"
validatorParameter="recid=fdId,model=com.landray.kmss.km.doc.model.KmDocTemplate,adminRoleName=ROLE_KMDOC_CATEGORY_MAINTAINER">
</request>
</module>
</configs>

相信从这个XML我们就大概能看的出,这个XML和那三个对象的封装关系了吧,然后我们需要指定className+.betwixt文件,这是因为我们需要自定义封装。
一定要注意,这个className一定是我们需要映射的的javeBean的类名,SysCfgRequest.betwixt
下面贴出文件的如何定义:
SysConfigs.betwixt

<?xml version="1.0" encoding="UTF-8"?>
<info primitiveTypes="attribute">
<element name="configs">
<element
name="module" property="modules"/>
<addDefaults />
</element>
</info>

SysCfgModule.betwixt

<?xml version="1.0" encoding="UTF-8"?>
<info primitiveTypes="attribute">
<element name="module">
<element name="request" property="requests"/>
<addDefaults />
</element>
</info>

SysCfgRequest.betwixt

<?xml version="1.0" encoding="UTF-8"?>
<info primitiveTypes="attribute">
<element name="request">
<element
name="query"
property="querys" />
<addDefaults />
</element>
</info>

然后是如何去调用:

public static void paseXmlUseApacheComponent() {
BeanReader reader = new BeanReader();
try {
reader.registerBeanClass(SysConfigs.class);
reader.getXMLIntrospector().getConfiguration()
.setAttributesForPrimitives(false);
SysConfigs p = (SysConfigs) reader.parse(Thread.currentThread()
.getContextClassLoader()
.getSystemResourceAsStream(("design.xml")));
System.out.println(p);
// System.out.println(p.getType());
} catch (Exception e) {
e.printStackTrace();
}
}

我总结的几个小小的使用心得:
1:例如在sysConfig中需要添加sysCfgModule对象,那么我们在他们各自对应的element中所指定的名字都要一至,例如在sysCfgModule.betwixt中element叫“module”,那么在sysConfigs.betwixt也应该叫"module",必须跟add后面的名字保持一致,否则它找不到
2:值得注意的是不要去重载,这个add方法,否则会有问题。
3:因为javaBean默认是使用set作为默认的赋值方法,如果需要使用add,则需要在.betwixt中使用<addDefaults />指定。
4:在.betwixt文件中property="****",不是必须的,他的意思是对应类中的某个属性,例如property=requests,如果没有这个,那么requests这个列表中不会添加元素。
*

运维网声明 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-324810-1-1.html 上篇帖子: apache ftpserver中可以返回的信息 下篇帖子: Apache上全部JAVA开源项目简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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