2010-01-14 10 views
26

मैं वेब सेवा का पर्दाफाश करने के लिए जेएक्स डब्ल्यूएस का उपयोग कर रहा हूं। इस सेवा के कुछ संचालन अपवाद उत्पन्न कर सकते हैं। आंतरिक सर्वर अपवाद नहीं, बल्कि अपवाद जो ऑपरेशन आमंत्रण के इनपुट तर्कों पर निर्भर हैं।जेएक्स-डब्ल्यूएस - दोषों के लिए मानचित्र अपवाद

तो मुझे लगता है कि मेरी आपरेशन एक कस्टम अपवाद है, तो जैसे फेंकता निर्दिष्ट करें:

@WebService 
@SOAPBinding(style = Style.RPC, use = Use.LITERAL) 
public class MyServiceEndpointImpl implements MyServiceEndpoint { 

    @WebMethod 
    public void throwsException throws InvalidInputException; 
} 

मैं निम्नलिखित स्टैकट्रेस अंत एप्लिकेशन चलते समय:

com.sun.xml.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class com.mypackage.ws.services.jaxws.InvalidInputExceptionBean is not found. Have you run APT to generate them? 
    at com.sun.xml.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:285) 
    at com.sun.xml.ws.model.RuntimeModeler.processExceptions(RuntimeModeler.java:1006) 
    at com.sun.xml.ws.model.RuntimeModeler.processRpcMethod(RuntimeModeler.java:969) 
    at com.sun.xml.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:546) 
    at com.sun.xml.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:370) 
    at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:256) 
    at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:322) 
    at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:188) 
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:467) 
    at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:333) 
    at org.jvnet.jax_ws_commons.spring.SpringService.getObject(SpringService.java:45) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:121) 

जोड़ना @XmlRootEntityInvalidInputException के लिए नहीं करता है समस्या का समाधान।

यदि वेब सेवाओं पर दोषों की रिपोर्ट करने का यह अनुशंसित तरीका नहीं है, तो क्या कोई बेहतर तरीका है? क्या मेरे अपवाद RuntimeException से प्राप्त हो सकते हैं और त्रुटि प्रबंधन के लिए परिवहन पर भरोसा करते हैं (यानी, सब कुछ एक SOAPException में लपेटा जाएगा)? मैं स्प्रिंग-डब्ल्यूएस 'SoapFaultAnnotationExceptionResolver जैसे कुछ की उम्मीद कर रहा था। क्या जैक्स-डब्ल्यूएस के लिए उपलब्ध कुछ समान है?

+0

शायद मुझे यह ध्यान रखना चाहिए कि जिस वर्ग में यह गायब है, com.mypackage.ws.services.jaxws.InvalidInputExceptionBean, वास्तव में मौजूद नहीं है। लेकिन मुझे लगता है कि यह स्वाभाविक था, कि इसे अपवाद राज्यों की तरह उत्पन्न किया जाना चाहिए। – waxwing

उत्तर

25

क्या आपने @WebFault के साथ अपना अपवाद एनोटेट करने का प्रयास किया था? इसके अलावा, क्या आप getFaultInfo() लागू करते हैं?

संपादित करें: मुझे एहसास हुआ कि मेरा उत्तर शायद पर्याप्त विस्तृत नहीं था। this thread (उदाहरण के लिए) में याद दिलाया के रूप में:

JAX-WS 2.0 विनिर्देश की मांग कि अपवाद @WebFault साथ एनोटेट [गलती जानकारी प्राप्त करने के गेटर] दो कंस्ट्रक्टर्स और एक विधि होना चाहिए:

WrapperException(String message, FaultBean faultInfo) 
WrapperException(String message, FaultBean faultInfo, Throwable cause) 
FaultBean getFaultInfo() 

WrapperException अपवाद के नाम से बदल दिया जाता है, और FaultBean वर्ग ऐसा नाम है जो गलती की फलियों को लागू करता है के द्वारा बदल दिया गया है। गलती बीन एक जावा बीन है जो में गलती की जानकारी शामिल है और गलती का कारण जानने के लिए वेब सेवा क्लाइंट द्वारा उपयोग किया जाता है।

यह जेएक्स-डब्ल्यूएस विनिर्देश के खंड 2.5 दोष में विस्तृत है। क्या आपका अपवाद इस अनुरूप है? क्या आप कोड पोस्ट कर सकते हैं?


ओपी सही है। विनिर्देश 2.1 के अनुसार, धारा 3.7 सेवा विशिष्ट अपवाद, @WebFault एनोटेशन का उपयोग करने की आवश्यकता नहीं है, जेएक्स-डब्ल्यूएस अपवादों के लिए गतिशील रूप से रैपर बीन्स उत्पन्न कर सकता है जो धारा 2.5 में वर्णित पैटर्न से मेल नहीं खाता है (केवल जानकारी के लिए गेटटर प्रदान करें आप गलती में उपस्थित होना चाहते हैं)। अपवादों के लिए जो खंड 2.5 में उल्लिखित पैटर्न से मेल खाते हैं (यानी अपवाद जिनमें getFaultInfo विधि और @WebFault एनोटेशन है), FaultBean XML स्कीमा के अपवाद को मैप करते समय JAXB में इनपुट के रूप में उपयोग किया जाता है।

तो ऊपर सुझाया गया समाधान (धारा 2.5 में वर्णित पैटर्न से मिलान करना) केवल एक कामकाज है। रैपर सेम की पीढ़ी सिर्फ अन्य अपवादों के लिए काम करनी चाहिए। और मुझे नहीं पता कि यह यहां क्यों विफल रहता है।

+0

मैंने नहीं किया। मैंने अभी कोशिश की, लेकिन मुझे एक ही त्रुटि मिलती है। लेकिन क्या मुझे @ वेबफॉल्ट के गुणों का नाम, targetNameSpace और faultBean भी निर्दिष्ट करने की आवश्यकता है? – waxwing

+0

संकेत के लिए धन्यवाद, मैं इसे देख लूंगा। नहीं, मैंने आपके द्वारा संकेतित रचनाकारों को लागू नहीं किया है। मैंने पढ़ा (गलत पढ़ा?) जेएक्स डब्लूएस कार्यान्वयन के रूप में विनिर्देश का वह हिस्सा * स्वचालित रूप से * उन रचनाकारों के साथ अपवाद रैपर उत्पन्न करेगा। मुझे लगता है कि मैं कुछ पीछे की ओर कर रहा हूं ... – waxwing

+0

यह पता चला है कि ऊपर लिखे गए अपवाद शैली के अनुरूप यह है कि जेएक्स-डब्ल्यूएस * अपवाद के लिए एक रैपर बीन नहीं बनाएगा, जो इसे अन्यथा चाहिए। तो यह मेरे लिए एक कामकाज के रूप में काम करता है। हालांकि, यह * spec में "3.7 सेवा विशिष्ट अपवाद" के अनुसार, एनोटेशन के बिना सभी अपवादों के साथ काम करना चाहिए। – waxwing

16

उपरोक्त उत्तर में एक जोड़ा।

@WebFault(faultBean = "com.mypackage.ws.exception.FaultBean") 
public class InvalidInputException extends Exception { 

    private static final long serialVersionUID = 1L; 

    private FaultBean faultBean; 

    public InvalidInputException() { 
     super(); 
    } 

    public InvalidInputException(String message, FaultBean faultBean, Throwable cause) { 
     super(message, cause); 
     this.faultBean = faultBean; 
    } 

    public InvalidInputException(String message, FaultBean faultBean) { 
     super(message); 
     this.faultBean = faultBean; 
    } 

    public FaultBean getFaultInfo() { 
     return faultBean; 
    } 
} 

और FaultBean सब पर वर्तमान में कोई डेटा के साथ सिर्फ एक सरल POJO है: मैं अपने InvalidInputException कार्यान्वयन के रूप में इस के साथ समाप्त हो गया। अब, जेएक्स-डब्ल्यूएस विनिर्देश के अनुसार (3.7 सेवा विशिष्ट अपवाद देखें), यह @WebFault के साथ एनोटेटेड अपवाद की आवश्यकता के अनुरूप है, इसलिए यह इसके लिए एक रैपर बीन नहीं बनाएगा, जो शायद असफल रहा था।

यह एक सभ्य कामकाज है, लेकिन यह प्रश्न में त्रुटि की व्याख्या नहीं करता है।

+1

इसके लिए +1, यह मेरा दिन बचाया :)। लेकिन यह केवल अनचाहे अपवादों के लिए चेक अपवादों के लिए काम कर रहा है। कोई सुराग ... – mogli

+0

@ वैक्सविंग मैंने एक उदाहरण लागू किया है हालांकि मेरा उदाहरण लक्ष्य नामस्थान तत्व को परिभाषित किए बिना काम नहीं करता है? – kamaci

+0

@rits वैसे ही मेरे साथ ऐसा हुआ मैंने वेबस्पेयर 8.5.5 पर यह कोशिश की जिसमें जैक्स-डब्ल्यूएस के लिए सेवा प्रदाता के रूप में एक्सिस 2 है और यह रनटाइम अपवाद के साथ काम नहीं करता है, लेकिन यह वेबस्पेयर लिबर्टी प्रोफाइल के साथ ऐसा करने के लिए काम करता है क्योंकि यह इसके बजाय अपाचे सीएक्सएफ का उपयोग करता है। यह वास्तव में शर्म की बात है क्योंकि अब मेरे ग्राहक को अपवाद को पकड़ने/घोषित करने की आवश्यकता है। –

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