2012-04-08 10 views
7

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

मैं किसी भी उचित प्रलेखन जो मुझे बताओ कि यह करने के लिए कर सकता है नहीं मिला है ...

ये axamples बाकी के लिए कर रहे हैं, लेकिन मैं सोप में भी इस बात प्रबंधित करना चाहते हैं।

इंटरसेप्टर

public class ErrorHandlerInterceptor extends AbstractPhaseInterceptor<Message> { 

    public ErrorHandlerInterceptor() { 
     super(Phase.POST_LOGICAL); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     Response response = Response 
      .status(Response.Status.BAD_REQUEST) 
      .entity("HOW TO GET A MESSAGE FROM AN EXCEPTION IN HERE???") 
      .build(); 
     message.getExchange().put(Response.class, response); 
    } 

} 

context.xml

<bean id="errorHandlerInterceptor" 
    class="cz.cvut.fit.wst.server.interceptor.ErrorHandlerInterceptor" /> 

<jaxrs:server address="/rest/"> 
    <jaxrs:serviceBeans> 
     <ref bean="restService" /> 
    </jaxrs:serviceBeans> 
    <jaxrs:outFaultInterceptors> 
     <ref bean="errorHandlerInterceptor" /> 
    </jaxrs:outFaultInterceptors> 
</jaxrs:server> 

उत्तर

5

और यहां the other piece of your puzzle है। आप पहले से ही JAX-RS का उपयोग कर रहे हैं, तो JAX-WS का उपयोग क्यों न करें?

This thread और this blog post एसओएपी दोषों में कवर मैपिंग अपवाद। लघु और मिठाई:

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

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

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

और आपका मानचित्रण है। बस @WebFault के संदर्भ में उपर्युक्त हस्ताक्षर के कार्यान्वयन को निर्दिष्ट करें और आपके SOAP API को इन्हें खुशी से मानचित्र बनाना चाहिए। जाहिर है, लिंक में अधिक जानकारी है।

+0

धन्यवाद। मैं आपके उत्तर को दो – user219882

+0

@ टॉमस के बीच प्रतिष्ठा को विभाजित करने के लिए अभी तक स्वीकार नहीं करता हूं, जबकि प्रयास महान है (मुझे खुशी है कि मैंने मदद की!), दुर्भाग्यवश, [बाउंटी सिस्टम कैसे काम करता है] http://meta.stackexchange.com/questions/2786/accept-multiple-answers-or-split-bounty-among-several-users) ([विवरण] (http://meta.stackexchange.com/questions/16065/कैसे-करता-इनाम-प्रणाली काम/16067 # 16067))। मैं आपके लिए इसे सुलझाने में असहज हूं क्योंकि मेरे परिणाम में हिस्सेदारी है, लेकिन यदि आप दो उत्तरों को इसके योग्य मानते हैं तो अतिरिक्त बकाया देने का विकल्प मौजूद है। परेशानी के लिए खेद हैं; मैंने सिस्टम नहीं लिखा था। :) – MrGomez

+0

ओह, यह बहुत बुरा है। मैंने ऐसा करने का फैसला किया: मैं mjwenk को बक्षीस देता हूं क्योंकि प्रतिष्ठा आपको उससे अधिक मदद करती है और आपके उत्तर को स्वीकार करती है क्योंकि आपके पास आरईएसटी और एसओएपी दोनों के लिंक हैं। मुझे लगता है कि यह एकमात्र उचित तरीका है (या कम से कम थोड़ा सा)। इसका उल्लेख करने के लिए धन्यवाद ... – user219882

13

आप JAX-आरएस उपयोग कर रहे हैं, क्यों सेटअप नहीं एक अपवाद नक्शाकार, और फिर उस नक्शाकार का उपयोग को संभालने के लिए प्रतिक्रिया।

एक साधारण उदाहरण:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class MyExceptionMapper implements 
     ExceptionMapper<MyException> { 

    @Override 
    public Response toResponse(MyException e) { 
     return Response.status(Status.NOT_FOUND).build(); 
    } 

} 

तो फिर तुम जोड़कर प्रदाता में jaxrs की सेवा रजिस्टर करने की आवश्यकता होगी:

<jaxrs:providers> 
    <bean class="com.blah.blah.blah.blah.MyExceptionMapper"/> 
</jaxrs:providers> 
संदर्भ में सर्वर config में

। इसके साथ आप अपवाद तक पूर्ण पहुंच प्राप्त कर सकते हैं, और जो कुछ भी आप चाहते हैं उसे प्राप्त कर सकते हैं।

+0

और यदि मैं SOAP का उपयोग करना चाहता हूं तो क्या होगा? मैं इसे कैसे संभाल सकता हूं? जेएक्स-आरएस के समान है या क्या आपके पास इंटरसेप्टर है? – user219882

+0

साबुन के लिए, मुझे लगता है कि आपको एक इंटरसेप्टर का उपयोग करना होगा। मैं कभी भी यह पता लगाने में सक्षम नहीं था कि मुझे सीएक्सएफ की साबुन सामग्री में काम करने के लिए क्या करना है। सौभाग्य से मेरे लिए यह एक समस्या का अधिक नहीं था, लेकिन जाक्स-आरएस रास्ता बहुत अच्छा लगता है। – mjwenk

+0

यदि मेरे पास निम्न परिदृश्य है तो क्या होगा। मेरे पास एक इंटरसेप्टर है जो सत्यापन करता है। और मेरे पास एक अपवाद हैंडलर भी है। अगर मैं इंटरसेप्टर से अपना कस्टम अपवाद फेंकना चाहता हूं, तो क्या मेरे अपवाद हैंडलर की रीस्पॉन्स विधि लागू की जाएगी? – Bhuvan

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