2015-06-03 10 views
7

मैं इस प्रकार RESTEasy का उपयोग कर एक साधारण ग्राहक है:RESTEasy ग्राहक अपवाद हैंडलिंग

public class Test { 
    public static void main(String[] args) { 
     ResteasyClient client = new ResteasyClientBuilder().build(); 
     ResteasyWebTarget target = client.target("http://localhost"); 
     client.register(new MyMapper()); 
     MyProxy proxy = target.proxy(MyProxy.class); 
     String r = proxy.getTest(); 
    } 
} 

public interface MyProxy { 
    @GET 
    @Path("test") 
    String getTest(); 
} 

@Provider 
public class MyMapper implements ClientExceptionMapper<BadRequestException>{ 

    @Override 
    public RuntimeException toException(BadRequestException arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("mapped a bad request exception"); 
     return null; 
    } 

} 

सर्वर एक उपयोगी संदेश के साथ http://localhost/test पर एक 400 - Bad Request वापस जाने के लिए कॉन्फ़िगर किया गया है। BadRequestException को ClientProxy द्वारा फेंक दिया जा रहा है। try/catch में लपेटने के अलावा, मैं getTest() अपवाद को कैसे पकड़ सकता हूं और एक स्ट्रिंग के रूप में प्रतिक्रिया के सहायक संदेश को वापस कर सकता हूं। मैंने विभिन्न ClientExceptionMapper कार्यान्वयन की कोशिश की, लेकिन ऐसा लगता है कि यह सही हो सकता है। उपर्युक्त कोड कभी भी toException पर कॉल नहीं करता है। मुझे यहां क्या समझ नहीं आ रहा है?

मेरा वर्तमान कार्य-आसपास ClientResponseFilter का उपयोग करना है और फिर setStatus(200) करें और प्रतिक्रिया इकाई में मूल स्थिति को भरें। इस तरह मैं अपवाद फेंकता से बचें।

+0

क्या आप समझ सकते हैं कि "सर्वर 400 - खराब अनुरोध वापस करने के लिए कॉन्फ़िगर किया गया है"? मेरा विचार यह है कि 'MyProxy.getTest() 'के कार्यान्वयन को वास्तव में एक अपवाद फेंकना चाहिए जिसमें एक उपयोगी संदेश है। फिर आप एक अपवाद मैपर का उपयोग 400 के लिए अपवाद को मैप करने के लिए करेंगे - खराब अनुरोध प्रतिक्रिया (और आप संदेश को प्रतिक्रिया के शरीर के रूप में शामिल कर सकते हैं)। – FGreg

+1

मेरे प्रश्न की पहली वाक्य पढ़ें। मैं एक ग्राहक लिख रहा हूं, सर्वर नहीं। – gogators

उत्तर

-1

मैं जैक्स-आरएस क्लाइंट एपीआई के माध्यम से जाने की सलाह दूंगा जब तक कि आपको RestEasy क्लाइंट का उपयोग करने की आवश्यकता न हो। (Jax-RS साथ RestEasy जहाजों, इसलिए कोई पुस्तकालय मतभेद है)

Client client = ClientFactory.newClient(); 
WebTarget target = client.target("http://localhost/test"); 
Response response = target.request().get(); 
if (response.getStatusCode() != Response.Status.OK.getStatusCode()) { 
    System.out.println(response.readEntity(String.class)); 
    return null; 
} 
String value = response.readEntity(String.class); 
response.close(); 

कारण है कि अपने नक्शाकार काम नहीं करता है, क्योंकि ग्राहक वास्तव में अपवाद फेंक नहीं है। क्लाइंट प्रॉक्सी को वैध परिणाम लौटा रहा है, और प्रॉक्सी इसे पढ़ रहा है, और अपवाद फेंक रहा है, जो मैपर के बाद इसे रोक सकता है।

+0

क्या यह प्रॉक्सी का उपयोग करने के सभी लाभों को फेंक नहीं देता है (उदाहरण के लिए उपरोक्त उदाहरण में उदाहरण/परीक्षण हार्डकोड किया गया है)? मैंने प्रश्न को पढ़ा कि कैसे एक और उपयोगी अपवाद फेंकने के लिए प्रॉक्सी प्राप्त करने के लिए। यह मेरे लिए अजीब बात है कि वास्तविक संदेश प्रतिक्रिया में होने पर प्रॉक्सी "खराब अनुरोध" के हार्ड-कोड किए गए संदेश के साथ अपवाद लौटा रहा है। क्या प्रॉक्सी के अपवाद हैंडलिंग के चारों ओर लपेटने के लिए एक इंटरसेप्टर है? –

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