关于 java 多继承的典型应用实例 针对不同业务类型的XML文件的解析

在PCS 项目:

public class CainiaoXMLMessageResolverServiceImpl implements CainiaoXMLMessageResolverService,InitializingBean {

CainiaoXMLMessageResolverServiceImpl 如下:

1.>>public interface CainiaoMessageResolver{

ResultMessage resolveMessage(CainiaoMessageEntity o);
CainiaoMessageEventTypeEnum getAcceptType();

Class getAcceptEntity();

}

实现此接口的类:

2. @Qualifier("XXX") Spring的Bean注入配置注解,该注解指定注入的Bean的名称,Spring框架使用byName方式寻找合格的bean,这样就消除了byType方式产生的歧义。(@Qualifier 用法见以下介绍

@Qualifier("logisticsDispatchedMessageResolver")
@Resource
private CainiaoMessageResolver logisticsDispatchedMessageResolver;

3.

private static Map<CainiaoMessageEventTypeEnum,CainiaoMessageResolver> map = new HashMap<CainiaoMessageEventTypeEnum,CainiaoMessageResolver>();

@Override
public void afterPropertiesSet() throws Exception {
map.put(logisticsDispatchedMessageResolver.getAcceptType(),logisticsDispatchedMessageResolver);
map.put(cancelLogisticsInfoMessageResolver.getAcceptType(),cancelLogisticsInfoMessageResolver);
map.put(cancelOrderMessageResolver.getAcceptType(),cancelOrderMessageResolver);
map.put(globalLinehaulAsnMessageResolver.getAcceptType(),globalLinehaulAsnMessageResolver);
map.put(logisticsSecDispatchedResolver.getAcceptType(),logisticsSecDispatchedResolver);
map.put(logisticsCombinedPaidMessageResolver.getAcceptType(),logisticsCombinedPaidMessageResolver);
map.put(logisticsUpdateInfoMessageResolver.getAcceptType(),logisticsUpdateInfoMessageResolver);
map.put(tradePaidMessageResolver.getAcceptType(),tradePaidMessageResolver);
map.put(transitWarehouseBoundoutNoticeMessageResolver.getAcceptType(),transitWarehouseBoundoutNoticeMessageResolver);
map.put(consoWarehouseConsignMessageResolver.getAcceptType(),consoWarehouseConsignMessageResolver);
map.put(consoWarehouseOutboundNoticeMessageResolver.getAcceptType(),consoWarehouseOutboundNoticeMessageResolver);
map.put(consoWarehouseCancelConsignMessageResolver.getAcceptType(),consoWarehouseCancelConsignMessageResolver);
map.put(consoWarehouseFeeStatusNoticeMessageResolver.getAcceptType(),consoWarehouseFeeStatusNoticeMessageResolver);
map.put(consoWarehouseUpdateConsignMessageResolver.getAcceptType(),consoWarehouseUpdateConsignMessageResolver);
map.put(consoWarehouseReturnRefundNoticeMessageResolver.getAcceptType(),consoWarehouseReturnRefundNoticeMessageResolver);
PCSAssert.assertFalse(CainiaoMessageEventTypeEnum.values().length != map.size(), "err110110", "有部分报文类型未注册解析处理器!");
}

说明 此类型实现 InitializingBean  覆写 afterPropertiesSet()方法。 在spring boot 初始化阶段 会调用 afterPropertiesSet()方法。

3. 取xml 业务类型代码:

private static CainiaoMessageEventTypeEnum getDataGramType(String xml) {
Document document = null;
CainiaoMessageEventTypeEnum type = null;
try {
document = DocumentHelper.parseText(xml);
Node eventType = document.selectSingleNode("//logisticsEvent/eventHeader/eventType");
if (eventType != null && StringUtils.isNotBlank(eventType.getText())) {
type = CainiaoMessageEventTypeEnum.valueOf(eventType.getText().trim());
}

} catch (DocumentException e) {
LOG.error("解析失败的报文:{}",xml);
return null;

}

return type;
}

4.得到不同的类型处理

resolver = map.get(datagramType);
if(resolver == null){
LOG.error("未获取到报文处理方法,报文类型:{},报文内容:{}",datagramType,xml);
presult = false;

}
else{
Class clazz = resolver.getAcceptEntity();
Object obj = xmlOperatorInterface.toBean(xml, clazz);
xmlObj =(CainiaoMessageEntity)obj;

5.找到对应业务的处理类的下的方法

for(int i =0;i<3;i++){
try{
resolveResult=resolver.resolveMessage(xmlObj);
errcode = resolveResult.getCode();
if( ! ResultMessage.RESULT_SUCCESS.equals(errcode)){
errmsg = resolveResult.getMessage();
}
succ = true;
break;
}catch(Exception ex){
if(i == 2){
e = ex;
LOG.error(e.getMessage(),e);
}
}
}

备注:关键写法:自己不知道的

@Override
public Class<CancelLogisticsInfo> getAcceptEntity() {
return CancelLogisticsInfo.class;
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

@Qualifier("XXX") Spring的Bean注入配置注解,该注解指定注入的Bean的名称,Spring框架使用byName方式寻找合格的bean,这样就消除了byType方式产生的歧义。

Spring的IoC的xml配置文件方式会让XML文件变的比较长而且繁琐,所以自JDK 1.5之后,越来越多的框架推出注解配置,

Spring的Bean注入就可以通过@Resource、@Autowire标记此处要注入bean,Spring框架通过反射方式给字段注入合适的对象。

@Autowire注解按照类型,即注解的字段的类型寻找该类型的实例bean,这种方式成为byType。这种方式会引发歧义,比如UserDAO整个框架可能有N多个该对象,那么Spring框架会采用一定规则寻找bean(转换为byName寻找,失败后报错)

@Resource是JDK提供的注解,默认就是按照byName的方式寻找bean,一般一个name对应一个bean,当找不到与名称匹配的bean才会按照类型装配(byType)。

想要让@Autowired方式按照name方式注入,可以结合@Qualifier("XX")使用,让@Autowired按照byName方式装配。

-------------------------------------------------------------------------------附备注-------------------------------------------------------------------

package com.fpx.order.util.xml;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
* XML解析,转换工具类
* @author xufeng
* @since 2017.7.9
* @version 1.1.0
*/
public interface XmlOperatorInterface {

public <T> T toBean(String xmlStr, Class<T> cls);

/**
* XStream技术转换对象为xml字符串
* @param obj 类声明上必须有XStream注解
* @return
*/
public String toXmlStr(Object obj);
}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

最新文章

  1. Linux远程服务器上安装SVN
  2. github-windows本地安装
  3. 自制jquery可编辑的下拉框
  4. windows服务 2.实时刷新App.config
  5. 问题解决——ShowWindow不显示窗口
  6. java之通过反射,来获得某对象的所有方法(类方法提取器)
  7. 【转】Polymer API开发指南 (二)(翻译)
  8. jira的插件
  9. Servlet学习的两个案例之网站访问次数的统计
  10. Redis 基础(一)
  11. CSS之垂直对齐
  12. Findout之为什么公司内部不能使用SSH协议连接外网服务器
  13. ASP.NET MVC下使用AngularJs语言(三):ng-options
  14. 转载 [深入学习C#]C#实现多线程的方式:使用Parallel类
  15. python --- 05 字典 集合
  16. mac 命令行上传文件,mac tar.gz命令压缩
  17. PyCharm引入python需要使用的包
  18. SQL Server 从2000复制数据到2008及以上版本的一种方法
  19. [iptables]iptables常规设置
  20. 解决RDP连接不上

热门文章

  1. css3动画效果:3 3D动画
  2. &lt;2014 03 18&gt; Term BreakPoint
  3. Flask(3)- flask中的CBV、werkzeug+上下文初步解读、偏函数和线程安全
  4. 前端基础-css(2)
  5. Python中的不同进制的语法和转换
  6. django重写用户模型
  7. 测试Windows live Writer
  8. MiniUI级联
  9. 转:.NET特性与反射
  10. 数据结构:JAVA实现二叉查找树