2012-06-19 14 views
5

तो मैं एक सरल वेब सेवा है वापसी:JAX-WS: बनाने के लिए एक सोप प्रतिक्रिया एक HashMap वस्तु

@WebMethod(operationName="getBookList") 
    public HashMap<Integer,Book> getBookList() 
    { 
     HashMap<Integer, Book> books = new HashMap<Integer,Book>(); 
     Book b1 = new Book(1,"title1"); 
     Book b2 = new Book(2, "title2"); 
     books.put(1, b1); 
     books.put(2, b2); 
     return books; 
    } 

पुस्तक वर्ग भी सरल है:

public class Book 
{ 
    private int id; 
    private String title; 

    public int getId() 
    { 
     return id; 
    } 

    public String getTitle() 
    { 
     return title; 
    } 
    public Book(int id, String title) 
    { 
     id = this.id; 
     title = this.title; 
    } 
} 

अब जब आप फोन ब्राउज़र की परीक्षक में इस वेब सेवा, मैं:

Method returned 
my.ws.HashMap : "[email protected]" 

SOAP Request 
    ... 
    ... 

SOAP Response 

<?xml version="1.0" encoding="UTF-8"?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <ns2:getBookListResponse xmlns:ns2="http://ws.my/"> 
      <return/> 
     </ns2:getBookListResponse> 
    </S:Body> 
</S:Envelope> 


यह ज करना संभव है लौटे HashMap वस्तु <return> टैग में दिखाया गया है, की तरह

<return> 
    <Book1> 
      id=1 
      title=title1 
    </Book1> 
</return> 
<return> 
    <Book2> 
      id=2 
      title=title2 
    </Book2> 
</return> 

कारण है कि मैं वापसी टैग में मान चाहते हैं कुछ एवेन्यू है, क्योंकि ग्राहक की ओर से, मैं jQuery AJAX का उपयोग कर रहा एक वेब पेज में इस कॉल करने के लिए वेब सेवा, और प्रतिक्रिया एक्सएमएल मुझे मिल रहा है बस <return> टैग खाली है। मैं AJAX क्लाइंट साइड से वास्तविक पुस्तक मान कैसे प्राप्त करूं?

$.ajax({ 
     url: myUrl, //the web service url 
     type: "POST", 
     dataType: "xml", 
     data: soapMessage, //the soap message. 
     complete: showMe,contentType: "text/xml; charset=\"utf-8\""   

    }); 
function showMe(xmlHttpRequest, status) 
{ (xmlHttpRequest.responseXML).find('return').each(function() 
    { // do something 
    } 
} 

मैं सरल हैलो दुनिया वेब सेवा के साथ परीक्षण किया है और यह काम किया:

यहाँ मेरी AJAX वेब कोड है।

+0

उत्तर "यह निर्भर करता है" :) आपका सबसे अच्छा शर्त है कि आप अपने पसंदीदा आईडीई (शायद ग्रहण जे 2 ईई, शायद कुछ और) को आग लगाना, थोड़ा जावा इंटरफ़ेस कोड करें, "WSDL में कनवर्ट करें" बटन दबाएं ... और देखें कि क्या होता है। फिर, अगर यह बार्फ़ नहीं है .. देखें कि परिणामी डब्लूएसडीएल ऐसा कुछ है जिसका उपयोग आप अपने सभी ग्राहकों (शायद एक्सिस, शायद एक्सिस 2, शायद नेट, शायद कुछ और पूरी तरह से) के साथ कर सकते हैं। सौभाग्य! – paulsm4

+0

आईडी = 1 - कक्षा पुस्तक से आईडी या हैश मैप से इंटीजर है? – Ilya

+0

आईडी कक्षा पुस्तक से है। मुझे नहीं पता कि एक्सएमएल प्रतिक्रिया कैसा दिखना चाहिए। लेकिन मैं उन उदाहरण फ़ील्ड को पुस्तक टैग में दिखाए गए पुस्तक ऑब्जेक्ट में चाहता हूं। – neo

उत्तर

3

लिखा है आदेश JAXB मदद करने के लिए की परवाह किए बिना हैश तालिका का निर्माण कर सकते आवश्यक जानकारी लौटने के लिए, आप एक कक्षा में 'लपेट' कर सकते हैं अपने HashMap और @XmlJavaTypeAdapter का उपयोग एक्सएमएल में मानचित्र के अपने कस्टम क्रमिकरण को बनाने के लिए।

public class Response { 

    @XmlJavaTypeAdapter(MapAdapter.class)  
    HashMap<Integer, Book> books; 

    public HashMap<Integer, Book> getBooks() { 
     return mapProperty; 
    } 

    public void setBooks(HashMap<Integer, Book> map) { 
     this.mapProperty = map; 
    } 

} 

फिर अपने WebMethod

@WebMethod(operationName="getBookList") 
    public Response getBookList() 
    { 
     HashMap<Integer, Book> books = new HashMap<Integer,Book>(); 
     Book b1 = new Book(1,"title1"); 
     Book b2 = new Book(2, "title2"); 
     books.put(1, b1); 
     books.put(2, b2); 
     Response resp = new Response(); 
     resp.setBooks(books); 
     return resp; 
    } 

की वापसी मान सब के बाद के रूप में इस वर्ग का उपयोग, आप अपने अनुकूलक MapAdapter को लागू करने की जरूरत है। ऐसा करने के कई तरीके हैं, इसलिए मैं आपको this

2

JAX-WS कैसे सोप प्रतिक्रिया लौट HashMap वस्तु

आप एक वेब सेवा के माध्यम से HashMap की तरह किसी भी जावा विशिष्ट निर्माणों का खुलासा नहीं चाहिए बनाने के लिए।
वेब सेवाएं लगभग इंटरऑपरेबिलिटी है और आपके जैसे पथ गलत तरीके हैं।
बस इतना है कि वेब सेवा ग्राहक प्रोग्रामिंग भाषा यह

+0

आपका सुझाव बहुत अस्पष्ट है। कृपया "आवश्यक जानकारी" पर विस्तृत या संपादित करें। मैं तब तक उपयोगी नहीं होगा जब तक आप एक बेहतर उत्तर नहीं दे सकते। धन्यवाद! –

+1

@ पॉल-सेबेस्टियन मोनोल: मुझे नहीं पता कि आप किस बारे में बात कर रहे हैं। मुझे लगता है कि कथन बहुत स्पष्ट है – Cratylus

+0

अच्छा, यह मुझे बहुत ज्यादा समझ में नहीं आता है। मेरा मतलब है, ठीक है, मुझे जेएक्स-डब्ल्यूएस के बारे में बहुत कुछ पता नहीं है, लेकिन सरल वस्तुओं और संग्रहों की तरह जावा "संरचनाएं" लौट रहा है। जेएक्सबी अपना काम करता है। इस हफ्ते थोड़ा और पढ़ने के बाद, मुझे एहसास हुआ कि मुझे जेएक्सबी के लिए उचित एनएमएल में परिवर्तित करने के लिए सही एनोटेशन के साथ विशिष्ट वर्ग प्रकार बनाने की आवश्यकता हो सकती है। क्या मैं सही हूँ या मैं गलत हूँ? और कृपया इस बार और अधिक स्पष्टीकरण प्रदान करें, "आपके द्वारा आपके द्वारा उत्तर में दी गई जानकारी के बारे में भी जानकारी दी गई है ताकि वेब सेवा क्लाइंट प्रोग्रामिंग भाषा के बावजूद हैश टेबल बना सके।" –

1

पर जेबॉस फोरम पर मुझे समाधान मिला, जो ग्लासफ़िश पर मेरे लिए काम करता है। मूल समाधान JBoss Forum, topic from Allesio Soldano पर है। इसमें एक सहायक वर्ग शामिल है, जिसमें हैश मैप नेस्टेड प्रकार के रूप में i.e. HashMap<String, String> है। वेब सेवा कक्षा से अधिक इस सहायक वर्ग को वापसी मूल्य के रूप में उपयोग किया जाता है। एनोटेशन @XmlAccessorType(XmlAccessType.FIELD) सुनिश्चित करता है कि एसओएपी प्रतिक्रिया में एसओएपी द्वारा उस संरचना का सही ढंग से इलाज किया जाएगा।

@XmlAccessorType(XmlAccessType.FIELD) 
public class MyHash { 
    protected HashMap<String,String> realMap; 

    // constructor 
    public MyHash() { 
    realMap = new HashMap<String,String>(); 
    } 

    /** 
    * @return HashMap<String,String> 
    */ 
    public HashMap<String,String> getRealMap() { 
    if (realMap==null) { 
     realMap = new HashMap<String,String>(); 
    } 
    return realMap; 
    } 

    /** 
    * @param key 
    * @param value 
    */ 
    public void put(String key, String value) { 
    realMap.put(key, value); 
    } 
} 

वेबसाइट सेवा में इस कक्षा का उपयोग सीधे किसी भी अतिरिक्त सेटिंग्स के बिना रिटर्न ऑब्जेक्ट के रूप में करें। बेशक, वस्तु को पहले बनाया जाना चाहिए और मानचित्र को अन्य पीओजेओ के समान ही भरना चाहिए।

यदि हैश मैप एक अन्य गैर आदिम प्रकारों (वस्तुओं) से होता है, तो मैंने प्रमाणित किया है कि घोंसले जटिल वस्तुओं पर उसी तरह से उपयोग करना संभव है। नियम यह है कि वह वर्ग विरासत में नहीं है यानी इसे विशेषता के रूप में घोंसला होना चाहिए और अंतिम श्रेणी में सभी गुण आदिम हैं।