先看下效果:
点击wsdl连接就可以看到具体服务的wsdl描述。
该接口的方法使用的参数为实体对象。
public void ProcessMessage(ESBEnvelope ESBEnvelope) {
// 逻辑处理
System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAA: " + ESBEnvelope.ESBHeader);
}
下面介绍一下上面的效果如何实现。
构建环境
为了兼容其他系统,我们只能使用wsdd这种方式创建webservice。项目本身使用spring框架+jdk1.8。一般情况下可以直接考虑使用spring整合axis这种方式。但是条件特殊,以下的这种方式直接使用spring注解是没用的。而且和jdk1.8新特性不兼容。
- wsdd的方式创建webservice
- spring框架
- jdk1.8
改造原来的代码(非必要)
wsdd不支持jdk1.8以上的新特性,具体报错我忘了,如果类中有lamda表达式或者简化的泛型都需要注意修改。
wsdd不兼容注解注入方式。具体原因现在不清楚,怀疑是加载顺序问题。现象是,使用注解注入的bean没有实例化。
因此考虑使用如下方式注入:
public CheckLaToAuraImpl() {
String realPath = "../application-nikola.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(realPath);
sequenceFunMapper = (SequenceFunMapper) applicationContext.getBean("sequenceFunMapper");
tNbCommonFun = (NbCommonFun) applicationContext.getBean("nbCommonFun");
uwTransactionStatusMapper = (UwTransactionStatusMapper) applicationContext.getBean("uwTransactionStatusMapper");
}
提供接口方法
public void ProcessMessage(ESBEnvelope ESBEnvelope) {
// 逻辑处理
System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAA: " + ESBEnvelope.ESBHeader);
}
这里定义接口方法和平时使用的方法没有什么区别。
添加wsdd文件
发布这种方式的webservice需要添加部署文件server-config.wsdd
。该文件需要放到WEB-INF目录下项目启动时自动部署。文件具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="adminPassword" value="admin" />
<parameter name="attachments.Directory"
value="./attachments" />
<parameter name="attachments.implementation"
value="org.apache.axis.attachments.AttachmentsImpl" />
<parameter name="sendXsiTypes" value="true" />
<parameter name="sendMultiRefs" value="true" />
<parameter name="sendXMLDeclaration" value="true" />
<parameter name="axis.sendMinimizedElements" value="true" />
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session" />
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request" />
<parameter name="extension" value=".jwr" />
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder"
type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="URLMapper"
type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="Authenticate"
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<transport name="http">
<requestFlow>
<handler type="URLMapper" />
<handler
type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder" />
</responseFlow>
</transport>
<!-- web service 接口 -->
<!-- <service name="CheckLaToAura" provider="java:RPC" style="rpc|document|wrapped" use="encoded|literal" streaming="off|on" attachment="MIME|DIME|NONE"> -->
<service name="CheckLaToAura" provider="java:RPC" >
<parameter name="className" value="com.nikola.uwca.service.impl.urn.CheckLaToAuraImpl" />
<parameter name="allowedMethods" value="underwrite,ProcessMessage,onlyString,useObj" />
<typeMapping languageSpecificType="java:com.nikola.uwca.service.urn.ESBEnvelope"
qname="ns1:ESBEnvelope" xmlns:ns1="com.nikola.uwca.service.urn"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" />
<typeMapping languageSpecificType="java:com.nikola.uwca.service.urn.ESBHeader"
qname="ns2:ESBHeader" xmlns:ns2="com.nikola.uwca.service.urn"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" />
</service>
</deployment>
上面的配置我们只需要操作service 节点。className为全类名。allowedMethods为类中要发布的方法名。typeMapping 用来指定序列化器和反序列化器,以及对应需要序列化和反序列化的类的包名和类名。
注意相应的类要实现序列化接口
public class ESBEnvelope implements Serializable{
private static final long serialVersionUID = 1L;
public ESBHeader ESBHeader;
public String MsgBody;
public ESBEnvelope() {
}
}
最后启动项目就可以看到发布的接口了。
其他要注意的地方
你也许会奇怪为什么你不写get和set方法。下图中的name的值生成的原则是根据get和set方法名生成的。只有使用public将属性共享出来才会使用实际的名字。比如:getMsgID() 对应的属性名:MsgID和msgID是没有区别的。即使定义属性名为MsgID生成后的也会变为msgID。而把get set 方法去掉后,则会使用属性名生成我们需要的element。