2017-08-09 7 views
10

मैं वसंत साबुन ws का उपयोग कर रहा हूँ।अलग-अलग नेमस्पेस और एक ही जेएक्सबी कक्षा के साथ मेरे पास दो अलग-अलग अंतराल कैसे हो सकते हैं?

मैं JAXB डोमेन कक्षाओं निम्नलिखित है जटिल प्रकार

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "reference", 
    "reason" 
}) 
@XmlRootElement(name = "request-message") 
public class RequestMessageType { 

    @XmlElement(name = "reference", required = true) 
    protected String reference; 
    @XmlElement(name = "reason") 
    protected String reason; 

    // I have getters and setters but removed here. 
} 

मैं @XmlRegistry एनोटेशन के साथ निम्नलिखित वर्ग है

@XmlRegistry 
public class ObjectFactory { 

    private final static QName _RequestMessage_QNAME = new QName("http://namespace/url", "request-message"); 

    public ObjectFactory() { 
    } 

    @XmlElementDecl(namespace = "http://namespace/url", name = "request-message") 
    public JAXBElement<RequestMessageType> createDisconnectRequestMessage(RequestMessageType value) { 
     return new JAXBElement<RequestMessageType>(_RequestMessage_QNAME, RequestMessageType.class, null, value); 
    }  
} 

निम्नलिखित हैं अंतिमबिंदुओं

@Endpoint 
    public class FirstEndPoint { 

     private static final String NAMESPACE_URI = "http://first/url/version"; 

     private static final Logger LOG = Logger.getLogger(FirstEndPoint.class); 

     @PayloadRoot(namespace = NAMESPACE_URI, localPart = "request-message") 
     @ResponsePayload 
     public JAXBElement<ResponseMessageType> requestMessage(@RequestPayload JAXBElement<RequestMessageType> requestMessage) { 
      LOG.info("request-message : first version ID : " + requestMessage.getValue().getReference()); 
     //Preparing response and return response 
     } 
    } 

    @Endpoint 
    public class SecondEndPoint { 

     private static final String NAMESPACE_URI = "http://second/url/version"; 
     private static final Logger LOG = Logger.getLogger(SecondEndPoint.class); 


     @PayloadRoot(namespace = NAMESPACE_URI, localPart = "request-message") 
     @ResponsePayload 
     public JAXBElement<ResponseMessageType> requestMessage(@RequestPayload JAXBElement<RequestMessageType> requestMessage) { 
      LOG.info("request-message : second version ID : " + requestMessage.getValue().getReference()); 
     //Preparing response and return response 

     } 
    } 

जब मैं साबुन बनाने के अनुरूप अनुरोध, मैं साबुन अनुरोध में एंडपॉइंट्स में दिए गए NAMESPACE_URI का उपयोग कर रहा हूं।

इधर, इस मामले में, मैं प्रतिक्रिया

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <SOAP-ENV:Fault> 
      <faultcode>SOAP-ENV:Server</faultcode> 
      <faultstring xml:lang="en">unexpected element (uri:"http://first/url/version", local:"request-message"). Expected elements are &lt;{http://namespace/url}request-message&gt;</faultstring> 
     </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

निम्नलिखित अगर मैं "http://namespace/url" का उपयोग NAMESPACE_URI के रूप में अंतिम बिंदु में और साबुन अनुरोध में मैं उचित प्रतिक्रिया हो रही है, लेकिन मैं इसके लिए अलग बनाने की कोशिश हो रही है दो अलग-अलग नामस्थानों के साथ दो अंतराल तो यह काम नहीं कर रहा है और प्रतिक्रिया देता है।

मैं एक ही JAXB वर्ग के साथ दो अलग अलग अंतिमबिंदुओं के लिए दो अलग-अलग नामस्थान का उपयोग कैसे कर सकते हैं? मैं वसंत और वेब सेवा के लिए पूरी तरह से नया हूँ।

अतिरिक्त जानकारी: RequestMessageType वर्ग और ObjectFactory वर्ग एक पैकेज में और package-info.java नाम स्थान में हैं

@javax.xml.bind.annotation.XmlSchema(namespace="http://namespace/url",elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.example 

मैं package-info.java फाइल में कुछ भी बदलने की जरूरत है है?

+0

मैं भी अपने उत्पन्न डबल्यूएसडीएल देखने के लिए मेरी स्कीमा मैं में किसी भी मामले में अच्छा होगा डी दो अनुरोध और प्रतिक्रिया तत्व परिभाषित करें। ये तत्व एक ही प्रकार के होंगे। जब मैं समय है अगर तुम मैं अपने GitHub खाते –

+0

पर एक साधारण परियोजना साझा कर सकते हैं चाहता हूँ मैं एक RequestMessageType सार बनाने की सलाह देते हैं, और 2 वर्गों से विस्तार करने के लिए होगा। वे वर्ग अलग-अलग पंजीकरण करते हैं।ऐसा करके: आपके wsdls के पास अलग-अलग नामस्थान होंगे, लेकिन आपकी सेवा परत को अनमोडिफाइड रखा जा सकता है। –

उत्तर

5

मैं एक नमूना प्रोजेक्ट बनाया। मुझे उम्मीद है कि यह आपके लिए उपयोगी हो सकता है। https://github.com/angeloimm/spring-ws-sample मूल रूप से यह मेरा WSDL फ़ाइल (सोप वेब सेवा में सभी डबल्यूएसडीएल द्वारा शासित है) है::

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:ss="http://www.example.org/SpringSample/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SpringSample" 
    targetNamespace="http://www.example.org/SpringSample/"> 
    <wsdl:types> 
     <xsd:schema targetNamespace="http://www.example.org/SpringSample/"> 
      <xsd:complexType name="abstractRequest"> 
       <xsd:sequence minOccurs="1" maxOccurs="1"> 
        <xsd:element name="reqName" type="xsd:string" nillable="false" 
         maxOccurs="1" minOccurs="1" /> 
       </xsd:sequence> 
      </xsd:complexType> 
      <xsd:complexType name="abstractResponse"> 
       <xsd:sequence minOccurs="1" maxOccurs="1"> 
        <xsd:element name="responseName" type="xsd:string" 
         nillable="false" maxOccurs="1" minOccurs="1" /> 
       </xsd:sequence> 
      </xsd:complexType> 
      <xsd:element name="requestImplementation" type="ss:abstractRequest" /> 
      <xsd:element name="responseImplementation" type="ss:abstractResponse" /> 
      <xsd:element name="requestImplementation2" type="ss:abstractRequest" /> 
      <xsd:element name="responseImplementation2" type="ss:abstractResponse" /> 
     </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="OperationRequest"> 
     <wsdl:part element="ss:requestImplementation" name="request" /> 
    </wsdl:message> 
    <wsdl:message name="OperationResponse"> 
     <wsdl:part element="ss:responseImplementation" name="response" /> 
    </wsdl:message> 
    <wsdl:message name="OperationRequest2"> 
     <wsdl:part element="ss:requestImplementation2" name="request2" /> 
    </wsdl:message> 
    <wsdl:message name="OperationResponse2"> 
     <wsdl:part element="ss:responseImplementation2" name="response2" /> 
    </wsdl:message> 
    <wsdl:portType name="SpringSample"> 
     <wsdl:operation name="Operation1"> 
      <wsdl:input message="ss:OperationRequest" /> 
      <wsdl:output message="ss:OperationResponse" /> 
     </wsdl:operation> 
     <wsdl:operation name="Operation2"> 
      <wsdl:input message="ss:OperationRequest2" /> 
      <wsdl:output message="ss:OperationResponse2" /> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="SpringSampleSOAP" type="ss:SpringSample"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
     <wsdl:operation name="Operation1"> 
      <soap:operation style="document" soapAction="http://www.example.org/SpringSample/Operation1" /> 
      <wsdl:input> 
       <soap:body use="literal" /> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal" /> 
      </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="Operation2"> 
      <soap:operation style="document" soapAction="http://www.example.org/SpringSample/Operation2" /> 
      <wsdl:input> 
       <soap:body use="literal" /> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal" /> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="SpringSample"> 
     <wsdl:port binding="ss:SpringSampleSOAP" name="SpringSampleSOAP"> 
      <soap:address location="http://www.example.org/" /> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

आप देख सकते हैं मैं 2 जटिल प्रकार परिभाषित: abstractRequest और abstractResponse आप यहाँ यह पर एक नज़र दे सकते हैं। तब मैं उन्हें, responseImplementation2 WS-I विनिर्देश के अनुसार तत्वों requestImplementation, requestImplementation2, responseImplementation का उपयोग करके लागू किया आप अलग संचालन और तत्वों

तब उपयोग करने के लिए मैं इस endpoint लिखा था की जरूरत है:

@Endpoint 
public class SampleEndpoint 
{ 
    private static final Logger logger = LoggerFactory.getLogger(SampleEndpoint.class.getName()); 
    private static final String NAME_SPACE_URI = "http://www.example.org/SpringSample/"; 

    @PayloadRoot(namespace = NAME_SPACE_URI, localPart="requestImplementation") 
    @ResponsePayload 
    public JAXBElement<AbstractResponse> operationOneResp(@RequestPayload JAXBElement<AbstractRequest> ar) 
    { 
     if(logger.isDebugEnabled()) 
     { 
      logger.debug("Operation 1 request "+ar.getValue().getReqName()); 
     } 
     ObjectFactory of = new ObjectFactory(); 
     AbstractResponse aResp = of.createAbstractResponse(); 
     aResp.setResponseName("operation 1 response"); 
     JAXBElement<AbstractResponse> result = of.createResponseImplementation(aResp); 
     return result; 
    } 
    @PayloadRoot(namespace = NAME_SPACE_URI, localPart="requestImplementation2") 
    @ResponsePayload 
    public JAXBElement<AbstractResponse> operationTwoResp(@RequestPayload JAXBElement<AbstractRequest> ar) 
    { 
     if(logger.isDebugEnabled()) 
     { 
      logger.debug("Operation 2 request "+ar.getValue().getReqName()); 
     } 
     ObjectFactory of = new ObjectFactory(); 
     AbstractResponse aResp = of.createAbstractResponse(); 
     aResp.setResponseName("operation 2 response"); 
     JAXBElement<AbstractResponse> result = of.createResponseImplementation(aResp); 
     return result; 
    } 
} 

आप के रूप में अब देख सकते हैं मैं हमेशा दोनों तरीकों में AbstractRequest और AbstractResponse JAXBElement का उपयोग करता हूं। 2 तरीकों में भी 2 अलग अंतिमबिंदुओं

मुझे आशा है कि यह तुम क्या जरूरत है और इसे उपयोगी

एंजेलो है में हो सकता है

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

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