关于 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);
}

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

java 多继承的典型应用实例(不同的报文不同的方法去解析)的更多相关文章

  1. java中注解的使用与实例 (二)

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  2. 【转】java中注解的使用与实例

    原文:http://www.cnblogs.com/pepcod/archive/2013/02/20/2918719.html java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单. ...

  3. java基础-继承

    浏览以下内容前,请点击并阅读 声明 一个由其他类继承的类叫子类(也叫继承类,扩展类等),该类继承的类叫父类或超类.除了Object类意外,所有的类都有切仅有一个父类,如果一个类没有用extends关键 ...

  4. java的继承机制

    这次我想深入探究以下java里类的继承机制.       我们知道,继承是java设计里的一个失败的地方.高司令说过:如果让他重新设计java的话,他会把继承去掉.而java里继承到底怎么了,会这么不 ...

  5. Java面向对象 继承(下)

     Java面向对象   继承(下) 知识概要:               (1)抽象类 1.1 抽象类概述                            1.2 抽象类的特点       ...

  6. Java的继承、封装与多态

    Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...

  7. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

  8. Java开发知识之Java的继承多态跟接口*

    Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...

  9. java入门---变量类型&类变量&局部变量&实例变量&静态变量

        在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下:     type identifier [ = value][, identifier [= value] ...] ; ...

随机推荐

  1. java的static final和final的区别

    转自:https://www.cnblogs.com/EasonJim/p/7841990.html 说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法 ...

  2. ES6入门概览二--数组

    一 数组 1. Array.from() 将两类对象转为真的数组 : 类似数组的对象(伪数组,如arguments.document.getElementsByTagNames等)和可遍历对象(包括E ...

  3. 模态窗口原理及注意事项--http://www.alisdn.com/wordpress/?p=53

    前言 在开发Windows引用程序的时候,在一些需要用户确认,或者提示用户注意的场合,经常使用模态对话框,或者叫模态窗口.在绝大多数情况下,模态窗口给开发人员带来了极大的便利,并且在某些应用上有不可替 ...

  4. Android自定义上拉控件SpringView

    Demo 先看一下SpringView的效果图: 1.拖动灰色部分可拖动下方视图,点击jump按钮可让下方视图自行滑动. 使用方法 布局文件: <com.zql.android.springvi ...

  5. zTree 树形控件 ajax动态加载数据

    很久没搞过树形控件了 , 再次接触看官网文档有点没懂,于是在网上找了个代码copy上,但数据是写死的,就想这在用ajax异步取出数据替换,下面是js代码 <SCRIPT type="t ...

  6. php 解决上传中文文件名时出现乱码的问题

    有时候上传文件是中文的文件名会出现乱码, 可以在移动文件时使用icov('utf-8','gb2312',filename)转换 代码: <?php //header('Content-type ...

  7. 高德js API moveAlong 函数的一个错误解决

    使用覆盖物之一:点标记,让点标记沿着固定的路线移动. API 提供了现成的函数 moveAlong() 开始以为 实现移动很简单:分两部 1.准备好经纬度数组 2.调用moveAlong()函数.按照 ...

  8. ES6通过Set数组去重

    一.Set 1.定义 Set对象是ES6中新定义的数据结构,类似于数组,它允许你存储任何类型的唯一值,不管是原始值还是对象引用. 2.语法 new Set([iterable]) iterable:可 ...

  9. Java 之单例设计模式

    设计模式: 对问题行之有效的解决方式, 其实它是一种思想. 单例设计模式 解决的问题:就是可以保证一个类在内存中的对象唯一性. 即单个实例. 比如对于A 和 B 两个程序使用同一个配置信息对象时, A ...

  10. Java 集合框架查阅技巧

    如何记录每一个容器的结构和所属体系呢? List ArrayList LinkedList Set HashSet TreeSet 其中,后缀名就是该集合所属的体系,前缀名就是该集合的数据结构. 看到 ...