<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-124  評(píng)論-194  文章-0  trackbacks-0
    SOAP中不支持HashMap,但可以通過(guò)適配器將數(shù)組轉(zhuǎn)換成HashMap的方式來(lái)支持。

    這是通過(guò)JAXB2.0中一個(gè)適配器類(lèi)來(lái)轉(zhuǎn)換的,先看下這個(gè)類(lèi)的說(shuō)明:

     

    javax.xml.bind.annotation.adapters
    類(lèi) XmlAdapter<ValueType,BoundType>

    java.lang.Object
    
      繼承者 javax.xml.bind.annotation.adapters.XmlAdapter<ValueType,BoundType>

    類(lèi)型參數(shù):
    BoundType - JAXB 不知道如何處理的一些類(lèi)型。編寫(xiě)一個(gè)適配器,以便允許通過(guò) ValueType 將此類(lèi)型用作內(nèi)存表示形式。
    ValueType - JAXB 無(wú)需其他操作便知道如何處理的類(lèi)型。


    這樣,我們先定義一個(gè)用來(lái)傳送數(shù)據(jù)的通用數(shù)組,包含了KEY和VALUE兩個(gè)成員用來(lái)存MAP的項(xiàng):
    public class OtherValues {
        
    public OtherValues () {};
        
        
    public OtherValues (String key, String value) {
            
    this.key = key;
            
    this.value = value;
        }
    ;
        
        
    public String key; 
        
        
    public String value;
    }


    再定義一個(gè)轉(zhuǎn)換類(lèi):(數(shù)組到HashMap的轉(zhuǎn)換)
    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;
      }

    }


    我們需要在一個(gè)結(jié)構(gòu)中來(lái)包含使用HashMap的變量,因?yàn)楸仨殲檫@個(gè)變量再聲明一個(gè)@XmlJavaTypeAdapter,這樣JAXB才會(huì)在收到相應(yīng)消息時(shí)調(diào)用我們的轉(zhuǎn)換類(lèi)。這是結(jié)構(gòu)定義:
    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;
        }


    }


    最后,在SOAP服務(wù)的聲明中,使用這個(gè)結(jié)構(gòu):(注意是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);
        
    }



    下面,我們來(lái)看如何通過(guò)JAVA及PERL的方式調(diào)用這個(gè)服務(wù):
    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);


    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";
    }


    產(chǎn)生的SOAP消息如下:
    請(qǐng)求:
    <?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>


    回應(yīng):
    <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>


    總結(jié):
    有了轉(zhuǎn)換器這個(gè)工具,我們可以在SOAP的JAXB綁定里支持各種JAVA的COLLECTION類(lèi)型,以及自定義類(lèi)型,打破了SOAP原始支持類(lèi)型的限制。
    posted on 2007-10-29 16:41 我愛(ài)佳娃 閱讀(7226) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): web技術(shù)

    評(píng)論:
    # re: 在CXF中用JAXB數(shù)據(jù)綁定支持HashMap類(lèi)型 2007-10-29 23:38 | dihin
    如果返回類(lèi)型是一個(gè)Map類(lèi)型的話 該怎么做?
    上次項(xiàng)目就遇到這個(gè)問(wèn)題  回復(fù)  更多評(píng)論
      
    # re: 在CXF中用JAXB數(shù)據(jù)綁定支持HashMap類(lèi)型 2007-10-30 10:14 | 我愛(ài)佳娃
    我做了實(shí)際實(shí)驗(yàn),返回值里用上面的方法也是可以的呀:
    結(jié)構(gòu)聲明和轉(zhuǎn)換類(lèi)不變,增加服務(wù)方法:
    public MapValue sendAlarmRetMap () {
    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");

    logger.info("return map");

    return mv;
    }

    在測(cè)試代碼中,增加調(diào)用:
    {
    MapValue mv = s.sendAlarmRetMap();
    logger.info("recv: " + mv.getDevIp() + mv.otherValues.get ("hehe2"));
    //this.assertEquals(r.size(), 10);
    }

    可以看到轉(zhuǎn)換類(lèi)同樣是起作用的。我估計(jì)你沒(méi)有把MAP放到一個(gè)結(jié)構(gòu)中,只有這樣聲明的轉(zhuǎn)換類(lèi)才能起作用。  回復(fù)  更多評(píng)論
      
    # re: 在CXF中用JAXB數(shù)據(jù)綁定支持HashMap類(lèi)型 2007-10-30 16:56 | dihin
    我把Map改為
    public class MyMap {
    private HashMap<String,String> map;
    //getter/setter...
    }
    沒(méi)用轉(zhuǎn)換類(lèi)也可以直接調(diào)用
    wsdl類(lèi)型為
    - <xs:complexType name="myMap">
    - <xs:sequence>
    - <xs:element name="map">
    - <xs:complexType>
    - <xs:sequence>
    - <xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
    - <xs:complexType>
    - <xs:sequence>
    <xs:element minOccurs="0" name="key" type="xs:string" />
    <xs:element minOccurs="0" name="value" type="xs:string" />
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
      回復(fù)  更多評(píng)論
      
    # re: 在CXF中用JAXB數(shù)據(jù)綁定支持HashMap類(lèi)型 2007-10-30 20:53 | 我愛(ài)佳娃
    @dihin
    我開(kāi)始就是這樣的,什么也不做,WSDL文件生成可以,但到實(shí)際調(diào)用時(shí)不能成功。還原不了MAP。
    你是不是用的Aegis數(shù)據(jù)綁定?似乎這種可以直接支持,JAXB只能加X(jué)MLADAPTER。  回復(fù)  更多評(píng)論
      
    # re: 在CXF中用JAXB數(shù)據(jù)綁定支持HashMap類(lèi)型 2012-07-18 18:44 | jerry.lees
    這樣轉(zhuǎn)換以后 傳中文會(huì)有亂碼問(wèn)題,該怎么解決啊?  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 久热中文字幕在线精品免费| 好大好深好猛好爽视频免费| 免费看大美女大黄大色| 黄网站色视频免费看无下截| 亚洲成a人片在线不卡一二三区| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 亚洲中文字幕无码一区| 亚洲女初尝黑人巨高清| 亚洲综合伊人制服丝袜美腿| 一级做α爱过程免费视频| 真人做A免费观看| 在线观看人成网站深夜免费| 亚洲狠狠婷婷综合久久久久| 久久夜色精品国产噜噜噜亚洲AV| 亚洲AV无码之国产精品| 污污网站免费观看| 免费H网站在线观看的| 国产精品V亚洲精品V日韩精品 | 日本牲交大片免费观看| 亚洲午夜福利精品无码| 亚洲一区二区三区四区视频| 成人片黄网站色大片免费观看cn| 无码精品国产一区二区三区免费| 人人狠狠综合久久亚洲高清| 久久精品国产亚洲综合色| 亚洲欧美日韩中文字幕一区二区三区| 秋霞人成在线观看免费视频| 亚洲国产精品碰碰| 亚洲AV成人影视在线观看| 国产精品亚洲专区在线播放| 中文字幕在线视频免费| 在线日韩av永久免费观看| 亚洲人成伊人成综合网久久| 四虎影视久久久免费| 最近免费中文字幕4| 亚洲精品福利网站| 老司机午夜在线视频免费| 男女做羞羞的事视频免费观看无遮挡| 亚洲成av人片天堂网| yellow免费网站| 免费一看一级毛片|