Xstream介绍
Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列化,使用非常方便。
1、不使用注解
不使用注解的时候要注意的点是:javabean中的类名以及字段名要和xml文件中的节点名完全相同,大小写也要一样,否则会解析报错
1.1、xml文件(history_property.xml)
<!--<?xml version="1.0" encoding="UTF-8" standalone="no"?>-->
<Config>
<configItems>
<ConfigItem>
<configName>QUERY_WEB</configName>
<configParams>
<ConfigParam>
<paramName>QUERY_URL</paramName>
<!--<ParamValue>http://192.111.25.245:9080/queryweb/services/IndexQueryService?wsdl</ParamValue>-->
<paramValue>http://192.111.25.111:9080/queryweb/services/IndexQueryService?wsdl</paramValue>
<!--<ParamValue>http://192.111.25.95:8080/queryweb/services/IndexQueryService?wsdl</ParamValue>-->
<paramDesc>queryWeb访问地址</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>MAX_PAGE_NUM</paramName>
<paramValue>10000</paramValue>
<paramDesc>queryWeb每面返回记录数</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>MAX_RECORD</paramName>
<paramValue>200000</paramValue>
<paramDesc>最大返回结果数</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>TIME_OUT</paramName>
<paramValue>60000</paramValue>
<paramDesc>超时时间毫秒</paramDesc>
</ConfigParam>
</configParams>
</ConfigItem>
<ConfigItem>
<configName>LOAD_DATA</configName>
<configParams>
<ConfigParam>
<paramName>ORG_FLUSH_TIME</paramName>
<paramValue>24</paramValue>
<paramDesc>组织数据更新时间,单位:小时</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>ROOT_ORG_LIST</paramName>
<paramValue>ROOT,900000000</paramValue>
<paramDesc>根节点的组织配置</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>QUERY_ORG_SQL</paramName>
<paramValue>select inst_no,creunit_no,inst_name,inst_parent_no from F_ORG_TYYH_ORGINFO</paramValue>
<paramDesc>组织数据查询语句</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>SENSITIVE_FLUSH_TIME</paramName>
<paramValue>24</paramValue>
<paramDesc>脱敏数据更新时间,单位:小时</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>QUERY_SENSITIVE_SQL</paramName>
<paramValue>select menu_id,menu_name,column_name,desen_type from cfg_hdqs_data_desensitization</paramValue>
<paramDesc>脱敏配置查询语句</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>DICT_FLUSH_TIME</paramName>
<paramValue>24</paramValue>
<paramDesc>字典数据更新时间,单位:小时</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>QUERY_DICT_CODE_SQL</paramName>
<paramValue>select dd_code,table_name,column_name,comments from cfg_hdqs_dd_code</paramValue>
<paramDesc>表字段对应字典表查询语句</paramDesc>
</ConfigParam>
<ConfigParam>
<paramName>QUERY_DICT_DESC_SQL</paramName>
<paramValue>select dd_code,column_code,code_desc,code_seq from cfg_hdqs_dd_desc</paramValue>
<paramDesc>字典表查询语句</paramDesc>
</ConfigParam>
</configParams>
</ConfigItem>
</configItems>
</Config>
1.2、javabean
1.2.1、Config
/**
* @Author Xu
* @ClassName: com.fjnx.history.entity
* @Description: 根节点
* @Date 2019/9/1
*/
public class Config {
private List<ConfigItem> configItems;//与xml文件中节点configItems大小写一致
public Config(List<ConfigItem> configItems) {
this.configItems = configItems;
}
public List<ConfigItem> getConfigItems() {
return configItems;
}
public void setConfigItems(List<ConfigItem> configItems) {
this.configItems = configItems;
}
@Override
public String toString() {
return "Config{" +
"configItems=" + configItems +
'}';
}
}
1.2.2、ConfigItem
package com.fjnx.history.entity;
import java.util.List;
/**
* @Author Xu
* @ClassName: com.fjnx.history.entity
* @Description:
* @Date 2019/9/1
*/
public class ConfigItem {
private String configName;
private List<ConfigParam> configParams;
public ConfigItem(String configName, List<ConfigParam> configParams) {
this.configName = configName;
this.configParams = configParams;
}
public String getConfigName() {
return configName;
}
public void setConfigName(String configName) {
this.configName = configName;
}
public List<ConfigParam> getConfigParams() {
return configParams;
}
public void setConfigParams(List<ConfigParam> configParams) {
this.configParams = configParams;
}
@Override
public String toString() {
return "ConfigItem{" +
"configName='" + configName + '\'' +
", configParams=" + configParams +
'}';
}
}
1.2.3、ConfigParam
package com.fjnx.history.entity;
/**
* @Author Xu
* @ClassName: com.fjnx.history.entity
* @Description:
* @Date 2019/9/1
*/
public class ConfigParam {
private String paramName;
private String paramValue;
private String paramDesc;
public ConfigParam(String paramName, String paramValue, String paramDesc) {
this.paramName = paramName;
this.paramValue = paramValue;
this.paramDesc = paramDesc;
}
public String getParamName() {
return paramName;
}
public void setParamName(String paramName) {
this.paramName = paramName;
}
public String getParamValue() {
return paramValue;
}
public void setParamValue(String paramValue) {
this.paramValue = paramValue;
}
public String getParamDesc() {
return paramDesc;
}
public void setParamDesc(String paramDesc) {
this.paramDesc = paramDesc;
}
@Override
public String toString() {
return "ConfigParam{" +
"paramName='" + paramName + '\'' +
", paramValue='" + paramValue + '\'' +
", paramDesc='" + paramDesc + '\'' +
'}';
}
}
1.3、代码调试
本次解析xml流文件
package com.fjnx.history;
import com.fjnx.history.entity.Config;
import com.fjnx.history.entity.ConfigItem;
import com.fjnx.history.entity.ConfigParam;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Author Xu
* @ClassName: com.fjnx.history
* @Description:
* @Date 2019/8/31
*/
public class ConfigManager {
private static final String HITORY_PROPERTY="history_property.xml";//配置文件名
public Config parseConfigProperty() {
InputStream in = null;
Config config=null;
try {
in = ConfigManager.class.getClassLoader().
getResourceAsStream(HITORY_PROPERTY);
XStream xStream = new XStream(new DomDriver());
// xStream.ignoreUnknownElements();//忽略未知的元素
//将xml转换为javabean
// ConfigItem configItems = (ConfigItem) xStream.fromXML(inputStream, ConfigItem.class);
xStream.alias("Config", Config.class);
xStream.alias("ConfigItem", ConfigItem.class);
xStream.alias("ConfigParam", ConfigParam.class);
config = (Config) xStream.fromXML(in);
return config;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return config;
}
static String getParam(String configName,String paramName){
ConfigManager configManager=new ConfigManager();
Config config=configManager.parseConfigProperty();
List<ConfigItem> configItems=config.getConfigItems();
String paramValue=null;
for(ConfigItem configItem:configItems){
if(configItem.equals(configItem.getConfigName())){
List<ConfigParam> configParams= configItem.getConfigParams();
for(ConfigParam configParam:configParams){
if(paramName.equals(configParam.getParamName())){
paramValue=configParam.getParamValue();
return paramValue;
}
}
}
}
return paramValue;
}
public static void main(String[] args) {
ConfigManager configManager=new ConfigManager();
configManager.parseConfigProperty();
}
}
2、使用注解(建议使用此方式,比较方便)
使用注解可以减少一些代码的编写,包括节点名称大小写问题,使用注解可以更方便的解决这个问题
2.1、xml文件
注意此处的xml文件命名不再与javabean中一一对应,比如节点ConfigItems ,javabean中变量名为configItems,接下来看如何使用注解方式解决名称不一致问题
2.1.1、history_property.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- -->
<Config xmlns:Config="http://www.w3.org/2001/XMLSchema-instance">
<!--<ConfigItem>-->
<!--<ConfigName>LOCAL_CONFIG</ConfigName>-->
<!--<ConfigParam>-->
<!--<ParamName>STATIC_IP</ParamName>-->
<!--<ParamValue>192.111.25.93</ParamValue>-->
<!--<ParamDesc>本机ip设置, 如果不配置取网卡ip</ParamDesc>-->
<!--</ConfigParam>-->
<!--</ConfigItem>-->
<ConfigItem>
<ConfigName>QUERY_WEB</ConfigName>
<ConfigParam>
<ParamName>QUERY_URL</ParamName>
<!--<ParamValue>http://192.111.25.245:9080/queryweb/services/IndexQueryService?wsdl</ParamValue>-->
<ParamValue>http://192.111.25.111:9080/queryweb/services/IndexQueryService?wsdl</ParamValue>
<!--<ParamValue>http://192.111.25.95:8080/queryweb/services/IndexQueryService?wsdl</ParamValue>-->
<ParamDesc>queryWeb访问地址</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>MAX_PAGE_NUM</ParamName>
<ParamValue>10000</ParamValue>
<ParamDesc>queryWeb每面返回记录数</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>MAX_RECORD</ParamName>
<ParamValue>200000</ParamValue>
<ParamDesc>最大返回结果数</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>TIME_OUT</ParamName>
<ParamValue>60000</ParamValue>
<ParamDesc>超时时间毫秒</ParamDesc>
</ConfigParam>
</ConfigItem>
<ConfigItem>
<ConfigName>LOAD_DATA</ConfigName>
<ConfigParam>
<ParamName>ORG_FLUSH_TIME</ParamName>
<ParamValue>24</ParamValue>
<ParamDesc>组织数据更新时间,单位:小时</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>ROOT_ORG_LIST</ParamName>
<ParamValue>ROOT,900000000</ParamValue>
<ParamDesc>根节点的组织配置</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>QUERY_ORG_SQL</ParamName>
<ParamValue>select inst_no,creunit_no,inst_name,inst_parent_no from F_ORG_TYYH_ORGINFO</ParamValue>
<ParamDesc>组织数据查询语句</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>SENSITIVE_FLUSH_TIME</ParamName>
<ParamValue>24</ParamValue>
<ParamDesc>脱敏数据更新时间,单位:小时</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>QUERY_SENSITIVE_SQL</ParamName>
<ParamValue>select menu_id,menu_name,column_name,desen_type from cfg_hdqs_data_desensitization</ParamValue>
<ParamDesc>脱敏配置查询语句</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>DICT_FLUSH_TIME</ParamName>
<ParamValue>24</ParamValue>
<ParamDesc>字典数据更新时间,单位:小时</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>QUERY_DICT_CODE_SQL</ParamName>
<ParamValue>select dd_code,table_name,column_name,comments from cfg_hdqs_dd_code</ParamValue>
<ParamDesc>表字段对应字典表查询语句</ParamDesc>
</ConfigParam>
<ConfigParam>
<ParamName>QUERY_DICT_DESC_SQL</ParamName>
<ParamValue>select dd_code,column_code,code_desc,code_seq from cfg_hdqs_dd_desc</ParamValue>
<ParamDesc>字典表查询语句</ParamDesc>
</ConfigParam>
</ConfigItem>
</Config>
2.2、javabean
2.2.1、Config
注意集合的注解
package com.fjnx.history.entity;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import java.util.List;
/**
* @Author Xu
* @ClassName: com.fjnx.history.entity
* @Description: 根节点
* @Date 2019/9/1
*/
@XStreamAlias("Config")
public class Config {
@XStreamImplicit(itemFieldName = "ConfigItem")
private List<ConfigItem> configItems;
public Config(List<ConfigItem> configItems) {
this.configItems = configItems;
}
public List<ConfigItem> getConfigItems() {
return configItems;
}
public void setConfigItems(List<ConfigItem> configItems) {
this.configItems = configItems;
}
@Override
public String toString() {
return "Config{" +
"configItems=" + configItems +
'}';
}
}
2.2.2、ConfigItem
package com.fjnx.history.entity;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import java.util.List;
/**
* @Author Xu
* @ClassName: com.fjnx.history.entity
* @Description:
* @Date 2019/9/1
*/
@XStreamAlias("ConfigItem")
public class ConfigItem {
@XStreamAlias("ConfigName")
private String configName;
@XStreamImplicit(itemFieldName = "ConfigParam")
private List<ConfigParam> configParams;
public ConfigItem(String configName, List<ConfigParam> configParams) {
this.configName = configName;
this.configParams = configParams;
}
public String getConfigName() {
return configName;
}
public void setConfigName(String configName) {
this.configName = configName;
}
public List<ConfigParam> getConfigParams() {
return configParams;
}
public void setConfigParams(List<ConfigParam> configParams) {
this.configParams = configParams;
}
@Override
public String toString() {
return "ConfigItem{" +
"configName='" + configName + '\'' +
", configParams=" + configParams +
'}';
}
}
2.2.3、ConfigParam
package com.fjnx.history.entity;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* @Author Xu
* @ClassName: com.fjnx.history.entity
* @Description:
* @Date 2019/9/1
*/
@XStreamAlias("ConfigParam")
public class ConfigParam {
@XStreamAlias("ParamName")
private String paramName;
@XStreamAlias("ParamValue")
private String paramValue;
@XStreamAlias("ParamDesc")
private String paramDesc;
public ConfigParam(String paramName, String paramValue, String paramDesc) {
this.paramName = paramName;
this.paramValue = paramValue;
this.paramDesc = paramDesc;
}
public String getParamName() {
return paramName;
}
public void setParamName(String paramName) {
this.paramName = paramName;
}
public String getParamValue() {
return paramValue;
}
public void setParamValue(String paramValue) {
this.paramValue = paramValue;
}
public String getParamDesc() {
return paramDesc;
}
public void setParamDesc(String paramDesc) {
this.paramDesc = paramDesc;
}
@Override
public String toString() {
return "ConfigParam{" +
"paramName='" + paramName + '\'' +
", paramValue='" + paramValue + '\'' +
", paramDesc='" + paramDesc + '\'' +
'}';
}
}
2.3、测试代码
package com.fjnx.history;
import com.fjnx.history.entity.Config;
import com.fjnx.history.entity.ConfigItem;
import com.fjnx.history.entity.ConfigParam;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Author Xu
* @ClassName: com.fjnx.history
* @Description:
* @Date 2019/8/31
*/
public class ConfigManager {
private static final String HITORY_PROPERTY="history_property.xml";//配置文件名
public Config parseConfigProperty() {
InputStream in = null;
Config config=null;
try {
in = ConfigManager.class.getClassLoader().
getResourceAsStream(HITORY_PROPERTY);
XStream xStream = new XStream(new DomDriver());
xStream.processAnnotations(Config.class);
// xStream.ignoreUnknownElements();//忽略未知的元素
//将xml转换为javabean
config = (Config) xStream.fromXML(in);
return config;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return config;
}
static String getParam(String configName,String paramName){
ConfigManager configManager=new ConfigManager();
Config config=configManager.parseConfigProperty();
List<ConfigItem> configItems=config.getConfigItems();
String paramValue=null;
for(ConfigItem configItem:configItems){
if(configItem.equals(configItem.getConfigName())){
List<ConfigParam> configParams= configItem.getConfigParams();
for(ConfigParam configParam:configParams){
if(paramName.equals(configParam.getParamName())){
paramValue=configParam.getParamValue();
return paramValue;
}
}
}
}
return paramValue;
}
public static void main(String[] args) {
ConfigManager configManager=new ConfigManager();
configManager.parseConfigProperty();
}
}
- 总结: 通过对比可以看出以注解方式能使xml配置文件更加简洁,我们要能熟练的使用注解配合xstream的一些 拍错方法的调用。