2012-06-13 14 views
7

द्वारा प्रस्तुत नहीं किया गया है मैं जेएक्स-डब्ल्यूएस के साथ वेब सेवा विकसित कर रहा हूं (मैं jaxws-maven-plugin पर wsimport लक्ष्य का उपयोग कर रहा हूं)। मैंने एक डब्लूएसडीएल लिखा जो एक्सएसडी स्कीमा आयात करता है।xsd स्कीमा wsdl

WEB-INF/wsdl/service.wsdl 
WEB-INF/wsdl/service.xsd 

इसके अलावा मैंने वेब सेवा कक्षाएं उत्पन्न की और अंतराल और सभी बनाया। सब कुछ अब तक महान काम किया। जब मैंने टॉमकैट 7 पर अपनी सेवा चलाई तो सबकुछ ठीक है। मैंने अपने ब्राउज़र में एक wsdl पहुँच सकते हैं:

http://localhost:8080/webService/servlet-url?wsdl 

लेकिन मैं एक XSD स्कीमा के लिए उपयोग नहीं कर सकते। समस्या यह wsdl में है:

<xsd:schema> 
<xsd:import namespace="http://ws.service/domain/1.0" schemaLocation="service.xsd"/> 
</xsd:schema> 
बेशक

कक्षाएं wsdl और XSD की पीढ़ी के दौरान स्थानीय पथ पर हैं, लेकिन मैं चाहता हूँ उन्हें जब वेब सेवा चल रही है दूर से सुलभ होने के लिए। मुझे पता है कि schemaLocation इस तरह कुछ होना चाहिए "http: // localhost: 8080/webService/servlet-url? Xsd = 1"।

wsdl में ब्राउज़र आयात में प्रस्तुत schould की तरह लग रहे:

<xsd:schema> 
    <xsd:import namespace="http://ws.service/domain/1.0" schemaLocation="http://localhost:8080/webService/servlet-url?wsdl&resource=service.xsd"/> 
    </xsd:schema> 

स्थानीय होस्ट: 8080/वेब सेवा/सर्वलेट wsdl मुझे देता है:?

wsdl:definitions targetNamespace="http://ws.serv.com/Service/1.0" name="emuiaService">   
<wsdl:types> 
    <xsd:schema> 
     <xsd:import namespace="http://ws.serv.com/Service/domain/1.0" schemaLocation="schema.xsd"/> 
    </xsd:schema> 
</wsdl:types> 
<wsdl:message name="halloMsg"> 
    <wsdl:part name="parameters" element="dom:halloRequest"/> 
</wsdl:message> 
<wsdl:message name="halloResponseMsg"> 
    <wsdl:part name="return" element="dom:halloResponse"/> 
</wsdl:message> 

और इतने पर ...

उत्तर

4

मैं लगभग विश्वास नहीं कर सकता कि यह हल करने में इतनी मुश्किल समस्या थी!

मैं इस समस्या का हल ढूंढने के लिए पागल की तरह गुगल रहा हूं! तब मैं अपने आप पर एक समाधान खोजने के लिए वास्तव में कठिन संघर्ष कर रहा हूं। जावा -6-ओपनजेडके के डिफ़ॉल्ट javax.xml.ws.spi.Provider कार्यान्वयन (जेआरई में "कारखाना" जो javax.xml.ws.Endpoint ऑब्जेक्ट्स बनाता है जो आप वेब सेवाओं को प्रकाशित करने के लिए उपयोग करते हैं) के माध्यम से डीबगर-स्टेपिंग द्वारा। अंत में कुछ चीजें सीखा है, जो मुझे मदद की एक समाधान है कि कम से कम मेरे वर्तमान JRE है, जो है में जावा SE में काम करता है, कम से कम शिल्प के लिए: इस समाधान जावा ईई में प्रयोग करने योग्य है

java version "1.6.0_33" 
OpenJDK Runtime Environment (IcedTea6 1.13.5) (6b33-1.13.5-1ubuntu0.12.04) 
OpenJDK Server VM (build 23.25-b01, mixed mode) 

चाहे मैं नहीं जानता (Endpoint नहीं # प्रकाशित) एक अप्रकाशित Endpoint पाने के लिए

package myservice; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.util.Arrays; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.ws.Endpoint; 

public class App 
{ 
    private static final String MY_SERVICE_XSD = "/wsdl/MyService.xsd"; 

    public static void main(String[] args) 
    { 
     Endpoint ep = Endpoint.create(new MyEndpointImpl()); 

     ep.setMetadata(Arrays.asList(sourceFromResource(MY_SERVICE_XSD))); 

     ep.publish("http://localhost:8080/svc/hello"); 
    } 

    private static Source sourceFromResource(String name) { 
     URL resource = App.class.getResource(name); 
     String systemId = resource.toExternalForm(); 
     InputStream inputStream; 
     try { 
      inputStream = resource.openStream(); 
     } catch (IOException e) { 
      throw new RuntimeException("Failed to create InputStream from resource \""+ name +"\"", e); 
     } 
     return new StreamSource(inputStream, systemId); 
    } 
} 

महत्वपूर्ण बात यह है कि मैं पहली बार उपयोग विधि Endpoint # पैदा करते हैं:

यहाँ कैसे मैं इसे हल है। फिर मैं XSD-file को "मेटा डेटा" के रूप में जोड़ता हूं (अभी भी अप्रकाशित) एंडपॉइंट (कोड "ep.setMetaData (...)")। फिर मैं एंडपॉइंट प्रकाशित करता हूं (कोड "ep.publish (...)")।

अब जब मैं http://localhost:8080/svc/hello?wsdl का उपयोग मैं:

<definitions targetNamespace="http://somewhere.net/my/namespace" name="MyService"> 
     <types> 
      <xsd:schema> 
       <xsd:import namespace="http://somewhere.net/my/namespace" 
          schemaLocation="http://localhost:8080/svc/hello?xsd=1"/> 
      </xsd:schema> 
     </types> 
        ... 
    </definitions> 

और मेरे XSD फ़ाइल http://localhost:8080/svc/hello?xsd=1 से उपलब्ध है!

ध्यान दें कि डिस्क पर मेरी MyService.wsdl फ़ाइल अभी भी मौजूद है:

  <xsd:schema> 
       <xsd:import namespace="http://somewhere.net/my/namespace" 
          schemaLocation="MyService.xsd"></xsd:import> 
      </xsd:schema> 
+0

मुझे वास्तव में याद नहीं आया कि मैंने क्या किया ... संभवतः अनुबंध के लिए स्विच किया गया लेकिन इसे हल करने के लिए धन्यवाद। मुझे उम्मीद है कि यह किसी दिन किसी की मदद करेगा;) – bemol

0

ठीक है चले हम।

WSDL फ़ाइल में इस

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<wsdl:definitions 
     targetNamespace="http://service.wsr.company.com/" 
     name="webServiceExample" 
     xmlns="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:tns="http://servicio.wsr.baz.com/" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> 

इस छोटे से टुकड़ा पर की तरह कुछ modificate करने के लिए महत्वपूर्ण xmlns टैग कर रहे हैं। वे स्कीमा एक्सएसडी की तैनाती के लिए काम करते हैं। अगला

<wsdl:types> 
    <xs:schema 
     xmlns:tns="http://service.wsr.company.com/" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://service.wsr.company.com/" version="1.0"> 

     ... 

    </xs:schema> 
</wsdl:types> 

आप नीचे दिए गए उन टैग में क्या आप service.xsd फ़ाइल में है या हम जारी रखने के

<wsdl:message name="your_method_name"> 
     <wsdl:part name="parameters" element="tns:your_method_name"/> 
    </wsdl:message> 
    <wsdl:message name="your_method_nameResponse"> 
     <wsdl:part name="parameters" element="tns:your_method_nameResponse"/> 
    </wsdl:message> 

उन ऊपर टैग अपने विधि नाम दिखाने हैं http://localhost:8080/webService/servlet-url?xsd=1 में यह प्रदर्शित करेंगे। अगला

<wsdl:portType name="webServiceExample"> 
      <wsdl:operation name="your_method_name"> 
      <wsdl:input message="tns:your_method_name"/> 
       <wsdl:output message="tns:your_method_nameResponse"/> 
      </wsdl:operation> 
    </wsdl:portType> 

उपर्युक्त टैर आपके ऑपरेशन के लिए हैं। जारी रखें

<wsdl:binding name="webServiceExamplePortBinding" type="tns:webServiceExample"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <wsdl:operation name="your_method_name"> 
      <soap:operation soapAction=""/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 

अगला एक :)

<wsdl:service name="webServiceExample"> 
    <wsdl:port name="webServiceExamplePort" binding="tns:webServiceExamplePortBinding"> 
     <soap:address location="REPLACE_WITH_ACTUAL_URL"/> 
</wsdl:port> 

और अंत में समाप्त हो गया :)

नोट टैग के लिए वर्तमान टैग बदलना होगा<wsdl:...></wsdl:...>

आप इसे सहेजते हैं, जनता और आपके पास मज़ेदार है एक्सएसडी स्कीमा डब्लूएसडीएल में प्रस्तुत किया गया है।

मुझे आशा है कि आपकी मदद करें। Ciao।

+0

दुर्भाग्य है कि काम नहीं किया। अभी भी स्कीमा xsd http के माध्यम से प्रस्तुत नहीं किया गया है। – bemol

+0

कृपया, मुझे दिखाएं कि आप कैसे कर रहे हैं और मुझे अपनी डब्लूएसडीएल फ़ाइल दिखाएं। :) – hekomobile

संबंधित मुद्दे