2013-03-03 9 views
34

मैं इस पर नया हूं, कुछ दस्तावेज़ पढ़ने को प्राप्त करने की कोशिश कर रहा हूं लेकिन यह काम नहीं कर रहा है, कृपया मेरे साथ भालू।जेएक्स-आरएस जर्सी अपवाद मैपर उपयोगकर्ता-परिभाषित अपवाद

मैं एक UserNotFoundMapper बनाया है ExceptionMappers इस तरह का उपयोग कर:

public class UserNotFoundMapper implements ExceptionMapper<UserNotFoundException> { 

@Override 
public Response toResponse(UserNotFoundException ex) { 
    return Response.status(404).entity(ex.getMessage()).type("text/plain").build(); 
} 

} 

यह मेरी सेवा में:

@GET 
@Path("/user") 
public Response getUser(@QueryParam("id") String id) throws UserNotFoundException{ 
    //Some user validation code with DB hit, if not found then 
    throw new UserNotFoundException(); 
} 

UserNotFoundException एक User-Defined अपवाद नहीं है।

public class UserNotFoundException extends Exception { 
     //SOME block of code 
} 

लेकिन जब मैं सेवा शुरू, UserDefinedExceptionMapper लागू नहीं हो रही है:

मैं इस कोशिश की। ऐसा लगता है कि मुझे UserDefinedException में कुछ याद आ रहा है। तब इस अपवाद को कैसे परिभाषित किया जाए?

कृपया मुझे बताएं कि UserNotFoundException को कैसे परिभाषित किया जाए।

उत्तर

51

आपको @Provider के साथ अपने अपवाद मैपर को एनोटेट करने की आवश्यकता है, अन्यथा यह जेएक्स-आरएस रनटाइम के साथ कभी भी पंजीकृत नहीं होगा।

@Provider 
public class UserNotFoundMapper implements 
     ExceptionMapper<UserNotFoundException> { 
    @Override 
    public Response toResponse(UserNotFoundException ex) { 
     return Response.status(404).entity(ex.getMessage()).type("text/plain") 
       .build(); 
    } 
} 
+0

उत्तर के लिए धन्यवाद। मुझे इससे संबंधित कुछ चीजों को जानने की ज़रूरत है: WebAplicationException का उपयोग करने और ExceptionMapper का उपयोग करने के बीच अंतर कहां है? मुझे यकीन नहीं है कि किस परिस्थितियों का उपयोग किया जाना चाहिए :(क्या आप कृपया इस पर अपना इनपुट प्रदान कर सकते हैं? – WhoAmI

+3

@WhoAmI - वेब एप्लिकेशन अपवाद स्वचालित रूप से जेएक्स-आरएस प्रदाता द्वारा मैप किए जाते हैं। इसलिए, अपवाद मैपर का उपयोग करने के विरोध में, उदाहरण के लिए , आप 'WebAplicationException' का विस्तार कर सकते हैं और इसे 'getResponse' विधि ओवरराइड कर सकते हैं।कुछ लोग इसे सभी अपवादों के लिए करना पसंद करते हैं जिन्हें वे पूरी तरह से अपने जेएक्स-आरएस कार्यान्वयन के लिए परिभाषित करते हैं। हालांकि मैपर्स बहुत अच्छे हैं, अपवाद मैपिंग के लिए जो WebAplicationException (जैसे सभी मानक जावा अपवाद, तृतीय पक्ष पुस्तकालयों आदि से अपवाद) से विस्तार नहीं करते हैं। – Perception

+0

यह कथन: 'वेब एप्लिकेशन अपवाद स्वचालित रूप से जेएक्स-आरएस प्रदाता द्वारा मैप किए जाते हैं' मैंने इसे कई दस्तावेज़ों में देखा है जो मैं नेट पर चारों ओर पढ़ रहा हूं। लेकिन यह समझने में सक्षम नहीं है कि वास्तव में इसका मतलब सरल शब्दों में क्या है और इसका महत्व/उपयोग क्या है :(क्या आप कृपया समझा सकते हैं? – WhoAmI

0

एक छोटी सी टिप्पणी, बल्कि 404 आदि कोड का उपयोग कर अधिक पठनीय और लिखने की त्रुटियों को कम होने का खतरा हो जाएगा की तुलना में Response.Status.NOT_FOUND का उपयोग करने की कोशिश, एक ही "पाठ/सादे" के लिए चला जाता है। नीचे दिया गया कोड है जो आपके द्वारा उल्लिखित अपवाद को संभालेगा। ओह और एक और बात अपने इंटरफ़ेस में अपने विधि @Produces (MediaType.TEXT_PLAIN) टिप्पणी करने के लिए याद

 

    public class UserNotFoundException extends Exception { 
     //... 
    } 

    public class UserServiceImpl implements UserService { 

     @Override 
     public Response getUser(@QueryParam("id") String id) { 
      final Response response; 
      try{ 
       // call user method 
       //if everything is ok 
       response = Response.status(Response.Status.OK).entity(whateverYouWant).type(MediaType.TEXT_PLAIN).build(); 
      } catch(UserNotFoundException ex) {   
       response = new UserNotFoundMapper().toResponse(ex); 
      } 

      return response; 
     } 
    } 

    In client slide you can check 

    public static boolean isUserExists(final Response serverResp) { 
     return serverResp != null && serverResp.getStatus() == Response.Status.NOT_FOUND.getStatusCode(); 
    } 

+6

आप मैनपर को मैन्युअल रूप से नहीं बुलाते हैं, और आप अपनी सेवा परत में जर्सी-विशिष्ट कक्षाओं का उपयोग नहीं करेंगे। यह मैपर्स का पूरा बिंदु है। –

+0

@RyanStewart इनपुट के लिए धन्यवाद। मैं इसके लिए नया हूं और इसे सीखने की कोशिश कर रहा हूं। पोस्टेड कोड के ऊपर teh में; अगर मैं 'नया उपयोगकर्ता नॉटफॉउंडएक्सप्शन() फेंकने के साथ मैपर इनवोकेशन लाइन को हटा देता हूं, तो यह ठीक है? मैं समझ नहीं पा रहा हूं कि आप 'क्या आप अपनी सेवा परत में जर्सी-विशिष्ट कक्षाओं का उपयोग नहीं करेंगे'। क्या आप इसे थोड़ा सा विवरण में समझा सकते हैं? – WhoAmI

0

जब एपीआई बनाने अपने ही अपवाद है कि RuntimeException तक फैली हुई है तो मैं डॉन 'बनाने है क्या मैं आमतौर पर करते हैं टी को मेरे अपवाद को पकड़ना जरूरी नहीं है।

नोट:

यहाँ एक उदाहरण है मैं JAX-आरएस उपयोग कर रहा हूँ जर्सी

पहले साथ: अपने ही अपवाद है कि RuntimeException से फैली पैदा करते हैं।

public class ExceptionName extends RuntimeException { 

private int code; 
private String message; 

public int getCode(){ 
    return code; 
} 

public String getMessage(){ 
    return message; 
} 

public ExceptionName(int code, String message) { 
    this.code = code; 
    this.message = message; 
} 

} 

इसके अलावा एक ExceptionMapper

@Provider 
public class ExceptionName implements ExceptionMapper<ExceptionName>{ 

    @Override 
    public Response toResponse(ExceptionName exception) { 
     return Response.status(exception.getCode()).entity(exception.getMessage()).build(); 
    } 

} 

और हर बार है कि मैं एक अपवाद मैं सिर्फ यह कहीं भी तरह यह करना फेंक करना चाहते हैं को लागू करने, अपवाद नक्शाकार लेने वाली ग्राहक के लिए एक प्रतिक्रिया लौटने का ख्याल रखना होगा एपीआई

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