2015-10-28 9 views
5

नहीं बुलाया जा रहा है, मैं इस अपवाद मैपर को 404 नहीं मिला प्रतिक्रिया देने के लिए आमंत्रित करने की कोशिश कर रहा हूं लेकिन यह 500 आंतरिक त्रुटि लौटाता रहता है। जर्सी संस्करण 2.22.1 है। नीचे कोड स्निपेट। सभी मदद की सराहना करते हैं।जर्सी अपवाद मैपर को

धन्यवाद।

अपवाद मैपर वर्ग।

package org.learn.rest.messengerdemo.exception; 

import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class DataNotFoundExceptionMapper implements ExceptionMapper<DataNotFoundException>{ 

    @Override 
    public Response toResponse(DataNotFoundException ex) { 
     return Response.status(Response.Status.FORBIDDEN).build(); 
    } 
} 

अपवाद कक्षा।

पैकेज org.learn.rest.messengerdemo.exception;

public class DataNotFoundException extends RuntimeException{ 

    private static final long serialVersionUID = 2176642539344388961L; 

    public DataNotFoundException(String message) 
    { 
     super(message); 
    } 
} 

सर्विस क्लास की विधि जो फेंकता है।

public Message getMessage(long messageId) { 
    Message message = messages.get(messageId); 
    if(message == null) 
    { 
     throw new DataNotFoundException("Message with id " + messageId + " not found"); 
    } 
    return message; 
} 

और संसाधन वर्ग।

@GET 
@Path("/{messageId}") 
public Message getMessage(@PathParam("messageId") long messageId) { 
    return messageService.getMessage(messageId); 
} 

उत्तर

14

अपने previous question से web.xml को देखते हुए, आप इस

<servlet> 
    <servlet-name>Jersey Web Application</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>org.learn.rest.messengerdemo.resources</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

क्या इस init-parm jersey.config.server.provider.packages का कहना है कि जर्सी @Path एनोटेट संसाधन वर्ग और @Provider एनोटेट प्रदाता कक्षाओं के लिए नामित किया गया पैकेज स्कैन चाहिए है और उन्हें पंजीकृत करें।

आपके पास केवल संसाधन पैकेज org.learn.rest.messengerdemo.resources सूचीबद्ध है, लेकिन आप ExceptionMapper एक अलग पैकेज में हैं। डिफ़ॉल्ट व्यवहार दोबारा स्कैन करना है, जिसका अर्थ उप-पैकेज भी है। तो यदि आपने इसके बजाय org.learn.rest.messengerdemo सूचीबद्ध किया है, तो आप अपवाद पैकेज दोनों संसाधन पैकेज और दोनों को प्रभावित करेंगे। या आप दोनों पैकेजों को सूचीबद्ध कर सकते हैं, अल्पविराम या सेमी-कॉलन से अलग हो सकते हैं। किसी भी तरह से काम करेगा

<param-value>org.learn.rest.messengerdemo</param-value> 
<!-- OR --> 
<param-value> 
    org.learn.rest.messengerdemo.resources, 
    org.learn.rest.messengerdemo.exception 
</param-value> 
1

कृपया ध्यान दें कि यह एनोटेशन की समस्या नहीं है। मैंने लोगों को टिप्पणियां दी हैं कि @ प्रदाता एनोटेशन के कारण यह पंजीकृत नहीं है, अगर आपने सही प्रदाता आयात किया है तो यह काम करेगा।

नीचे मेरा समाधान ढूंढें नमूना REST API विकसित करते समय मुझे एक ही समस्या का सामना करना पड़ा है। org.manish.rest.message.model

  • डेटाबेस - - org.manish.rest.message.database
  • संसाधन - org.manish.rest.message.resource
  • org.manish.rest.message तरह REST API बनाते समय आधार पैकेज नाम मैं दे दिया है, मैं इस

    1. मॉडल की तरह आधार पैकेज के तहत हर दूसरे संकुल बनाने के लिए माना जाता

      वेब.एक्सएमएल इनिट परम में इस

      <init-param> 
            <param-name>jersey.config.server.provider.packages</param-name> 
            <param-value>org.manish.rest.message</param-value> 
      </init-param> 
      

      इसका मतलब है, मैंने अपना बेस पैकेज web.xml में पंजीकृत किया है, मैं इसके तहत कभी भी पैकेज कैसे बनाऊंगा; मेरी कॉल और आवश्यकता के आधार पर जेएक्स-आरएस द्वारा विचार किया जाएगा। लेकिन जब मैंने गलती से अपना अपवाद पैकेज बनाया, तो मैंने पैकेज नाम org.manish.rest.exception रखा। चूंकि यह web.xml में पंजीकृत नहीं था, इसलिए मेरी पूरी अपवाद कक्षा को जेएक्स-आरएस द्वारा अपवाद को संभालने के लिए नहीं माना गया था।एक सुधार के रूप में, मैंने अपने अपवाद पैकेज नाम को org.manish.rest.exception से org.manish.rest.message.exception

      के बाद मैंने पोस्ट मैन में एक बार निष्पादित किया और मुझे अपेक्षित परिणाम मिला।

      आशा है कि यह आपकी क्वेरी को हल कर सकता है।

      धन्यवाद मनीष

    0

    मैं एक और विकल्प ... परिवर्तन नक्शाकार पैकेज संसाधन पैकेज जहां अपवाद सामान्य रूप से पकड़ा जा सकता मिलान करने के लिए प्रस्ताव करने के लिए करना चाहते हैं।

    संसाधन वर्गों पैकेज मानते हुए है:

    package org.learn.rest.messengerdemo.resources; 
    

    परिवर्तन नक्शाकार वर्ग पैकेज से:

    package org.learn.rest.messengerdemo.exception; 
    

    रहे हैं:

    package org.learn.rest.messengerdemo.resources; 
    

    इस तरह आप के साथ नगण्य नहीं की जाएगी ढांचे उत्पन्न फाइलें या असामान्य वाक्यविन्यास।

    मुझे अभी भी समझ में नहीं आ रहा है कि कोशिश/पकड़ का उपयोग क्यों नहीं किया जाता है, लेकिन मैं अपने जावा ज्ञान का पुनर्निर्माण कर रहा हूं इसलिए मैं कोई राय इंजेक्ट नहीं करूँगा या किसी से अनुरोध नहीं करूंगा। यदि इसका वर्तमान अभ्यास है तो मैं जल्द ही सीखूंगा। और मैपर उस पर एक दिलचस्प अवसर हैं।

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