使用WSDD搭建webservice

先看下效果:
在这里插入图片描述
点击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。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值