- 浏览: 302919 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ae6623:
ae6623 写道大哥,你是怎么知道它对临时文件有限制的,我也 ...
导出excel2007 poi3.8 -
ae6623:
大哥,你是怎么知道它对临时文件有限制的,我也发现这个bug了, ...
导出excel2007 poi3.8 -
coralandbill:
下载不了啊 能不能给我发一个simpleProj.war包啊 ...
jqgrid使用步骤及说明 -
maojin:
这是jqgrid几?那个电话号码校验的函数能调到吗?
jqgrid使用步骤及说明 -
qingyezhu:
请问,用poi3.8中的wordtohtmlconver类将d ...
导出excel2007 poi3.8
SOAP中不支持HashMap,但可以通过适配器将数组转换成HashMap的方式来支持。
这是通过JAXB2.0中一个适配器类来转换的,先看下这个类的说明:
javax.xml.bind.annotation.adapters
类 XmlAdapter<ValueType,BoundType>
java.lang.Object
javax.xml.bind.annotation.adapters.XmlAdapter<ValueType,BoundType>
BoundType
- JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过 ValueType
将此类型用作内存表示形式。
ValueType
- JAXB 无需其他操作便知道如何处理的类型。
这样,我们先定义一个用来传送数据的通用数组,包含了KEY和VALUE两个成员用来存MAP的项:
public
class
OtherValues
{
public OtherValues () {} ;
public OtherValues (String key, String value) {
this .key = key;
this .value = value;
} ;
public String key;
public String value;
}
public OtherValues () {} ;
public OtherValues (String key, String value) {
this .key = key;
this .value = value;
} ;
public String key;
public String value;
}
再定义一个转换类:(数组到HashMap的转换)
import
java.util.HashMap;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class OtherValuesAdapter extends XmlAdapter < OtherValues[], HashMap < String,String >> {
static Logger logger = Logger.getLogger (OtherValuesAdapter. class .getName());
public HashMap < String, String > unmarshal(OtherValues[] value ) {
logger.error( " unmarshal begin " );
HashMap < String, String > r = new HashMap < String,String > ();
for ( OtherValues c : value )
r.put(c.key, c.value);
return r;
}
public OtherValues[] marshal( HashMap < String,String > value ) {
logger.error( " marshal begin " );
OtherValues[] pairs = new OtherValues[value.size ()];
int i = 0 ;
for (Entry < String,String > entry : value.entrySet()) {
pairs[i ++ ] = new OtherValues (entry.getKey(), entry.getValue());
}
return pairs;
}
}
import java.util.Map.Entry;
import org.apache.log4j.Logger;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class OtherValuesAdapter extends XmlAdapter < OtherValues[], HashMap < String,String >> {
static Logger logger = Logger.getLogger (OtherValuesAdapter. class .getName());
public HashMap < String, String > unmarshal(OtherValues[] value ) {
logger.error( " unmarshal begin " );
HashMap < String, String > r = new HashMap < String,String > ();
for ( OtherValues c : value )
r.put(c.key, c.value);
return r;
}
public OtherValues[] marshal( HashMap < String,String > value ) {
logger.error( " marshal begin " );
OtherValues[] pairs = new OtherValues[value.size ()];
int i = 0 ;
for (Entry < String,String > entry : value.entrySet()) {
pairs[i ++ ] = new OtherValues (entry.getKey(), entry.getValue());
}
return pairs;
}
}
我们需要在一个结构中来包含使用HashMap的变量,因为必须为这个变量再声明一个@XmlJavaTypeAdapter,这样JAXB才会在收到相应消息时调用我们的转换类。这是结构定义:
import
java.util.HashMap;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
public class MapValue {
private String devName;
private String devIp;
@XmlJavaTypeAdapter(OtherValuesAdapter. class )
public HashMap < String, String > otherValues;
public String getDevIp() {
return devIp;
}
public void setDevIp(String devIp) {
this .devIp = devIp;
}
public String getDevName() {
return devName;
}
public void setDevName(String devName) {
this .devName = devName;
}
}
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
public class MapValue {
private String devName;
private String devIp;
@XmlJavaTypeAdapter(OtherValuesAdapter. class )
public HashMap < String, String > otherValues;
public String getDevIp() {
return devIp;
}
public void setDevIp(String devIp) {
this .devIp = devIp;
}
public String getDevName() {
return devName;
}
public void setDevName(String devName) {
this .devName = devName;
}
}
最后,在SOAP服务的声明中,使用这个结构:(注意是sendAlarmMap方法)
import
java.util.List;
import javax.jws. * ;
import javax.jws.soap. * ;
import javax.jws.soap.SOAPBinding. * ;
import java.util.HashMap;
import java.util.Map;
@WebService
public interface NotifyService {
public int sendAlarm (DeviceValue alarm);
public String sendAlarmString (String stralarm);
public List < DeviceValue > sendAlarmArr (List < DeviceValue > arr);
public int sendAlarmMap (MapValue m);
}
import javax.jws. * ;
import javax.jws.soap. * ;
import javax.jws.soap.SOAPBinding. * ;
import java.util.HashMap;
import java.util.Map;
@WebService
public interface NotifyService {
public int sendAlarm (DeviceValue alarm);
public String sendAlarmString (String stralarm);
public List < DeviceValue > sendAlarmArr (List < DeviceValue > arr);
public int sendAlarmMap (MapValue m);
}
下面,我们来看如何通过JAVA及PERL的方式调用这个服务:
JAVA的方式:
NotifyService s
=
(NotifyService) getBean (
"
notifyClient
"
);
MapValue mv = new MapValue ();
mv.otherValues = new HashMap < String, String > ();
mv.otherValues.put ( " hehe2 " , " a " );
mv.otherValues.put ( " 2 " , " b " );
mv.setDevIp ( " he " );
mv.setDevName ( " hehe2 " );
int r = s.sendAlarmMap(mv);
logger.info( " recv: " + r);
MapValue mv = new MapValue ();
mv.otherValues = new HashMap < String, String > ();
mv.otherValues.put ( " hehe2 " , " a " );
mv.otherValues.put ( " 2 " , " b " );
mv.setDevIp ( " he " );
mv.setDevName ( " hehe2 " );
int r = s.sendAlarmMap(mv);
logger.info( " recv: " + r);
PERL的方式:
{
#
call send map alarm
my @params = (SOAP :: Data -> name(arg0 => {
devName => " hehe " ,
devIp => " ip1 " ,
otherValues => [{
item => [
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe2 " , value => " ip2 " }]
}]
}));
my $method = SOAP :: Data -> name( ' sendAlarmMap ' );
my $result = $soap -> call( $method => @params );
print " \nsend map alarm result:\n " ;
if ( $result -> fault)
{
print $result -> faultstring;
}
else
{
print $result -> result;
}
print " \n\n " ;
}
my @params = (SOAP :: Data -> name(arg0 => {
devName => " hehe " ,
devIp => " ip1 " ,
otherValues => [{
item => [
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe1 " , value => " ip1 " } ,
{key => " hehe2 " , value => " ip2 " }]
}]
}));
my $method = SOAP :: Data -> name( ' sendAlarmMap ' );
my $result = $soap -> call( $method => @params );
print " \nsend map alarm result:\n " ;
if ( $result -> fault)
{
print $result -> faultstring;
}
else
{
print $result -> result;
}
print " \n\n " ;
}
产生的SOAP消息如下:
请求:
<? xml version="1.0" encoding="UTF-8" ?> < soap:Envelope xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc ="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" soap:encodingStyle ="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap ="http://schemas.xmlsoap.org/soap/envelope/" >< soap:Body >< sendAlarmMap >< arg0 >< devName > hehe </ devName >< otherValues >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip2 </ value >< key > hehe2 </ key ></ item ></ otherValues >< devIp > ip1 </ devIp ></ arg0 ></ sendAlarmMap ></ soap:Body ></ soap:Envelope >
回应:
< soap:Envelope xmlns:soap ="http://schemas.xmlsoap.org/soap/envelope/" >< soap:Body >< ns1:sendAlarmMapResponse xmlns:ns1 ="http://magic.nms.exchangebit.com/" >< return > 99 </ return ></ ns1:sendAlarmMapResponse ></ soap:Body ></ soap:Envelope >
<? xml version="1.0" encoding="UTF-8" ?> < soap:Envelope xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc ="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" soap:encodingStyle ="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap ="http://schemas.xmlsoap.org/soap/envelope/" >< soap:Body >< sendAlarmMap >< arg0 >< devName > hehe </ devName >< otherValues >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip1 </ value >< key > hehe1 </ key ></ item >< item >< value > ip2 </ value >< key > hehe2 </ key ></ item ></ otherValues >< devIp > ip1 </ devIp ></ arg0 ></ sendAlarmMap ></ soap:Body ></ soap:Envelope >
回应:
< soap:Envelope xmlns:soap ="http://schemas.xmlsoap.org/soap/envelope/" >< soap:Body >< ns1:sendAlarmMapResponse xmlns:ns1 ="http://magic.nms.exchangebit.com/" >< return > 99 </ return ></ ns1:sendAlarmMapResponse ></ soap:Body ></ soap:Envelope >
总结:
有了转换器这个工具,我们可以在SOAP的JAXB绑定里支持各种JAVA的COLLECTION类型,以及自定义类型,打破了SOAP原始支持类型的限制。
发表评论
-
JVM配置详解及调优
2012-06-21 14:13 1076堆大小设置 JVM 中最大 ... -
WABACUS框架介绍
2012-05-17 10:07 2107... -
JAVA开发性能调优
2012-05-09 11:41 974下面是参考网络资源总结的一些在Java编程中尽可能要做到 ... -
使用WFetch查看HTTP请求、响应报文
2012-05-07 10:36 1303WFetch界面比较简陋,但是已经满足我的一般需求了。想 ... -
java命令行指定JDK运行环境
2011-12-14 22:05 2730set path=C:/Program Files/J ... -
ibaitis 级联查询
2011-04-12 13:10 2477使用iBatis开发已经有一年了,这一年来不管愿意不愿意,喜欢 ... -
关于struts2 遍历Map最全的总结
2011-04-06 16:44 962Struts2 中iterator标签遍 ... -
Struts2+JSON+jQuery实现异步交互数据时选择要序列化的属性(一注解方式)
2011-03-29 00:59 1580在使用Struts2的JSON插件,实现Action中的属性序 ... -
struts2 + jquery struts2 处理json
2011-03-28 14:10 2433<package name="default& ... -
cascade 与 inverse区别
2011-03-15 09:58 1009一、cascade 1.概述 ... -
hibernate fetch的select 和 join的区别
2011-03-11 17:15 3620join 查询的时候,是用一条语句查处所有记录,包括关联表记录 ... -
深入struts2的配置文件 struts2标签解释
2011-03-08 22:59 1704[color=darkred][/color]深入struts ... -
ajax访问SSH2返回connect异常的处理
2011-03-08 22:38 1501在struts2 pojo action中有对象属性的,并被h ... -
SSH2整合设计 事务管理
2011-03-08 22:27 1537ssh2整合SSH2整合 2009-12-02 09:31:4 ... -
ssh dao设计
2011-03-07 23:45 1146spring和hibernate 泛型:http://lbxh ... -
ldap查询条件
2010-08-30 09:19 2587定义查询过滤器(Search Filter Definitio ... -
java.lang.NoSuchMethodError: com.sun.xml.ws.api.server.WSEndpoint.getPolicyMap()
2010-07-20 16:42 4516在使用CXF 和spring发布WEB服务时出现了java.l ... -
jax ws 注释详解
2010-07-09 10:38 2694基于 XML 的 Web Service 的 Java A ... -
Rest 和 soap比较
2010-07-07 15:48 1144我有这样一个推断,在计算机世界中,但凡那些让开发人员记住的重要 ... -
serviceMix发布webservice服务
2010-07-07 09:44 2883利用serviceMix对外发布外部的webservice服务 ...
相关推荐
处理cxf版本和jaxb包中冲突问题,解决webservice中遇到的版本问题
覆盖以下内容:基于JAX-WS规范和CXF自身的前端模式实现,CXF支持的数据绑定(DataBindings),CXF支持的WSDL绑定,CXF支持的传输协议绑定。CXF的调式、配置、日志、发布和工具。CXF实现RESTful服务。CXF对WS-* 的...
WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- 3.2之前版本 java 6 3.1 ...
webservice实例 CXF的JAXWS和JAXRS实现 及JAXB标准接口实现带jar包 全部手写,保证质量,导入就可以用
赠送jar包:cxf-rt-databinding-jaxb-3.0.1.jar; 赠送原API文档:cxf-rt-databinding-jaxb-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-databinding-jaxb-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-...
简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar...
cxf 完整的服务端客户端
本包为springboot框架 添加了cxf 和根据aop 灵活的使用多数据源 根据自己的需求去添加数据源 只需要在application.yml中添加数据源信息 以别名定义数据源 再在dao层或是service层 方法或者类上方添加@DataSource(...
Apache CXF 是一个开源的 Web Services 框架。如果需要轻松实现 Web Services 的发布和使用,可以将其作为其中一种解决方案。
07.处理Map等CXF无法自动转换的复合数据类型的形参和返回值
CXF 客户端最少jar包支持,CXF 客户端最少jar包支持,CXF 客户端最少jar包支持,
04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值
JAVA7和JAVA8对应CXF资源 WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- ...
通过cxf将多个webServices整合到一起方便管理与维护
cxf框架与jdk6出现冲突的支持包,请大家支持下!
CXF 包含了大量的功能特性,但是主要集中在以下几个方面: 支持 Web Services 标准:...支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。
转成了PDF, 总共10页。 本文旨在介绍CXF架构,以便对CXF有一个快速...7. 数据绑定支持 8. 协议绑定支持 9. 多种层传输支持 10. 多种编程语言支持 11. WS-*和相关特性支持 12. 代码生成工具盒WSDL验证工具 13. 灵活部署
CXF发布的REST服务返回JSON格式数据,只有服务端代码,没有客户端代码,可以通过http://localhost:9999/roomservice/room、http://localhost:9999/roomservice/room/001来访问测试数据。
CXF+mybatis数据源营销方案,实现微服务信息化,移动开发
spring 4.2.0 集成的cxf3.1.18的jar包,cxf-core-3.1.18.jar、cxf-rt-bindings-soap-3.1.18.jar、cxf-rt-databinding-jaxb-3.1.18.jar、cxf-rt-frontend-jaxws-3.1.18.jar、cxf-rt-frontend-simple-3.1.18.jar、cxf-...