2011-02-04 12 views
6

का उपयोग कर वेब सर्विसेज में अपवाद पदानुक्रमों की जांच की गई है। मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां हम गलत इनपुट या गलत कार्रवाई के उपयोगकर्ता को सूचित करने के लिए चेक अपवादों का उपयोग करना चाहते हैं। इस तरह के अपवाद पदानुक्रम जैसे चाहिए:जेएक्स-डब्ल्यूएस मेवेन प्लगइन (wsimport)

public abstract class BusinessException extends java.lang.Exception {...} 
public class InvalidInputException extends BusinessException {...} 
public class InvalidActionException extends BusinessException {...} 

हम डबल्यूएसडीएल/XSD (अनुबंध-पहले दृष्टिकोण) से जावा कोड उत्पन्न Maven, jaxws-maven-plugin, लक्ष्य wsimport का उपयोग कर।

मैंने इस (http://www.ibm.com/developerworks/xml/library/ws-tip-jaxrpc.html) ट्यूटोरियल के साथ जाने की कोशिश की है (यह जैक्स-आरपीसी के लिए है, लेकिन यह जैक्स-डब्ल्यू के लिए भी काम करता है)। मैं

<definitions ...> 

    <message name="empty"/> 
    <message name="ExceptionMessage"> 
     <part name="fault" element="ows:ValidationException"/> 
    </message> 

    <portType name="TestWebService"> 
     <operation name="throwException"> 
      <input message="tns:empty"/> 
      <output message="tns:empty"/> 
      <fault name="fault" message="tns:ExceptionMessage"/> 
     </operation> 
    </portType> 

    <binding name="TestWebServicePortBinding" 
      type="tns:TestWebService"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" 
         style="document"/> 


     <operation name="throwException"> 
      <input> 
       <soap:body use="literal"/> 
      </input> 
      <output> 
       <soap:body use="literal"/> 
      </output> 
      <fault name="fault"> 
       <soap:fault name="fault" use="literal"/> 
      </fault> 
     </operation> 
    </binding> 

    ... 
</definitions> 

लिखा ows में परिभाषित प्रकार के साथ: नाम स्थान

<xs:complexType name="BusinessException" abstract="true"> 
    <xs:sequence> 
     <xs:element name="code" type="xs:int"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="InvalidInputException"> 
    <xs:complexContent> 
     <xs:extension base="tns:BusinessException"> 
      <xs:sequence> 
       <xs:element name="validationMessage" type="xs:string"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:complexType name="InvalidActionException"> 
    <xs:complexContent> 
     <xs:extension base="tns:BusinessException"> 
      <xs:sequence> 
       <xs:element name="actionName" type="xs:string"/> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="ValidationException" type="tns:InvalidInputException"/> 

जब मैं mvn clean package चलाने के लिए, मैं निम्नलिखित (टिककर खेल, setters, ctors और एनोटेशन निकाला गया) हो:

public interface TestWebService { 
    @WebMethod 
    public void throwException() throws ExceptionMessage; 
} 

public class ExceptionMessage extends Exception { 
    private InvalidInputException faultInfo; 
    (...) 
} 

public abstract class BusinessException implements Serializable { 
    protected int code; 
    (...) 
} 

public class InvalidActionException extends BusinessException implements Serializable { 
    protected String actionName; 
    (...) 
} 

public class InvalidInputException extends BusinessException implements Serializable { 
    protected String validationMessage; 
    (...) 
} 

जो मैं नहीं चाहता था, क्योंकि एक अपवाद है और इसमें faultInto डेटा अलग-अलग हो सकता है। XSD/WSDL में पूरी तरह से ऊपर बताए गए अपवाद पदानुक्रम बनाने का कोई तरीका है? ExceptionMessage कक्षा <message> टैग से सीधे उत्पन्न होती है, इसलिए मैं वहां माता-पिता/बच्चे बनाने का कोई तरीका नहीं ढूंढ पा रहा था।

+0

क्या आपने कभी इसके लिए एक और समाधान खोजा है? मुझे – santiagozky

+0

नंबर पर एक ही समस्या का सामना करना पड़ रहा है, नीचे मेरा जवाब देखें। जहां तक ​​मुझे पता चला कि आप इसे अनुबंध में नहीं कर सकते- जैक्सव के साथ पहला दृष्टिकोण। –

उत्तर

0

ऐसा लगता है कि यह संभव ऊपर उल्लेख किया है प्रौद्योगिकी का उपयोग कर (WSDL/XSD (अनुबंध-पहले दृष्टिकोण) Maven, jaxws-maven-plugin का उपयोग कर, wsimport लक्ष्य) नहीं है ।

0

आप डबल्यूएसडीएल आपरेशन करने के लिए बदल सकते हैं ...

<portType name="TestWebService"> 
    <operation name="throwException"> 
     <input message="tns:empty"/> 
     <output message="tns:empty"/> 
     <fault name="fault" message="tns:BusinessException"/> 
    </operation> 
</portType> 
+0

मैं इसे बदल सकता हूं, लेकिन क्या इससे मुझे अपवाद विरासत बनाने में मदद मिलेगी? (उदाहरण के लिए। InvalidInputException BusinessException को बढ़ाता है) –

+0

ऐसा लगता है कि आपके जेनरेट किए गए कोड में सही विरासत है। एकमात्र समस्या यह है कि आपकी throwException विधि यह घोषणा कर रही है कि यह BusinessException के बजाय अपवाद मैसेज फेंकता है। – Pace

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