2013-02-13 60 views
5

मैं अपने वेब-एप्लिकेशन में जर्सी का उपयोग कर रहा हूं। सर्वर पर भेजा गया डेटा JSON प्रारूप में है, जो बदले में सर्वर-अंत में अनारक्षित है और प्राप्त ऑब्जेक्ट का उपयोग आगे की प्रक्रिया में किया जाता है। सुरक्षा लेखापरीक्षा ने इस दृष्टिकोण के लिए कुछ भेद्यताएं उठाईं।जेएसओएन डेटा के अनारक्षित होने के दौरान पार्सर अपवादों को कैसे संभालें?

मेरे बाकी कोड:

@POST 
@Path("/registerManga") 
@Produces(MediaType.APPLICATION_JSON) 
public Response registerManga(MangaBean mBean){ 
    System.out.println(mBean); 
    return Response.status(200).build(); 
} 

MangaBean:

public class MangaBean { 
    public String title; 
    public String author; 

    @Override 
    public String toString() { 
     return "MangaBean [title=" + title + ", author=" + author + "]"; 
    } 
    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getAuthor() { 
     return author; 
    } 
    public void setAuthor(String author) { 
     this.author = author; 
    } 


} 

डेटा इस प्रारूप में भेज दिया जाता है:

["title":"Bleach","author":"kubo tite"] 

ऊपर डेटा को सफलतापूर्वक एक वस्तु और मैं में unmarshalled है इसे आउटपुट के रूप में प्राप्त करें:

MangaBean [title=Bleach, author=kubo tite] 

लेकिन डेटा करने के लिए बदल गया है:

["title":"<script>alert("123");</script>","author":"kubo tite"] 

500 आंतरिक सर्वर त्रुटि होती है और उपयोगकर्ता के लिए प्रदर्शित किया जाता है: में

javax.servlet.ServletException: org.codehaus.jackson.JsonParseException: Unexpected character ('1' (code 49)): was expecting comma to separate OBJECT entries 
at [Source: [email protected]; line: 1, column: 28] 
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

"" की अप्रत्याशित घटना खड़ी कर रहा है त्रुटियों पार्सर। चूंकि दृश्यों के पीछे unmarshalling किया जाता है और मेरे पास इसका कोई नियंत्रण नहीं है, मैं उठाए गए अपवाद को संभालने में असमर्थ हूं।

मेरा प्रश्न यह है कि मैं इस अपवाद को कैसे संभाल सकता हूं और स्टैकट्रैस के बजाय उपयोगकर्ता को उचित प्रतिक्रिया देता हूं। कृपया सलाह दें।

उत्तर

14

JSON पार्स अपवाद को संभालने के लिए एक अपवाद नक्शाकार रजिस्टर:

@Provider 
class JSONParseExceptionMapper implements ExceptionMapper<JsonParseException> { 
    @Override 
    public Response toResponse(final JsonParseException jpe) { 
     // Create and return an appropriate response here 
     return Response.status(Status.BAD_REQUEST) 
       .entity("Invalid data supplied for request").build(); 
    } 
} 
+0

मैं वास्तव में समझ नहीं पा रहा हूं कि @Provider वाक्यविन्यास का उपयोग कैसे करें .. क्या मैं निम्नलिखित परिदृश्य को संभालने के लिए इसका उपयोग कर सकता हूं: Unruly API रिटर्न [] जब एक मानचित्र {} के बजाय खाली होता है। उपरोक्त से जैसा लगता है, मैं इस अपवाद को मैप कर सकता हूं और इसे संभाल सकता हूं? – deepwinter

+1

मैं अपने जीवन के लिए जर्सी 2.13 में काम करने के लिए नहीं मिल सकता। ओह। –

+0

हम सीएक्सएफ का उपयोग कर रहे हैं, लेकिन यह वैसे भी काम किया। धन्यवाद! – fool4jesus

0

बोध जवाब

package com.shashi.service; 

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

import org.apache.log4j.Logger; 

import org.codehaus.jackson.JsonParseException; 
import com.sun.jersey.api.client.ClientResponse.Status; 
import com.talklingo.service.v1.UserManagementService; 
@Provider 
public class JSONParseExceptionMapper implements ExceptionMapper<JsonParseException> { 

private static Logger logger = Logger 
    .getLogger(JSONParseExceptionMapper.class); 

    public Response toResponse(final JsonParseException jpe) { 
     // Create and return an appropriate response here 

     return Response.status(Status.BAD_REQUEST) 
       .entity("Invalid data supplied for request").build(); 

    } 
} 
+0

यह नहीं कहा जाता है, मुझे और क्या करने की ज़रूरत है? –

1

से भरा वर्ग उदाहरण जोड़ने से इस अपवाद नक्शाकार नहीं बुलाया जा रहा हो (जॉन डिंग की टिप्पणी के रूप में संकेत दिया), सुनिश्चित करें कि आपने इसे अपने संसाधन कॉनफिग के साथ पंजीकृत किया है।

इसके अलावा, ध्यान दें कि जैक्सनफेचर (जर्सी 2.x के साथ) का उपयोग करते समय इसमें अपवाद मैपर शामिल है, लेकिन यदि आप अपना खुद का पंजीकरण करते हैं तो इसे प्राथमिकता दी जाएगी।

यहां पैकेज द्वारा इसे पंजीकृत करने का एक उदाहरण दिया गया है। तो JSONParseExceptionMapper को "your.package.here" में रखें और इसे उठाया जाएगा।

@ApplicationPath("whatever") 
public class MyAppResourceConfig extends ResourceConfig 
{ 
    public MyAppResourceConfig() 
    { 
     packages("your.package.here"); 
     register(JacksonFeature.class); 
    } 
} 

मूल प्रश्न के लिए, आपको JsonMappingExceptionMapper को भी संभालना होगा।

0

दूसरा विकल्प संसाधन कॉनफिग में हो सकता है, JsonParseExceptionMapper क्लास पंजीकृत करें।

रजिस्टर (JsonParseExceptionMapper.class);

0

एक ही पैकेज (या उप पैकेज) web.xml फ़ाइल

1

@ धारणा के जवाब के अलावा में वर्णित में अपवाद हैंडलिंग कक्षा जोड़ें, लापता बात यह है कि अपवाद निगल लिया हो और सूचना नहीं है।आपको एक सत्यापन श्रोता पास करना चाहिए:

private static final String[] severity = new String[] {"Warning", "Error", "Fatal Error"}; 
void beforeUnmarshal(Unmarshaller u, Object parent) throws JAXBException { 
    u.setEventHandler((evt) -> { 
     throw new WebApplicationException(severity[evt.getSeverity()]+": Error while parsing request body: " + evt.getMessage(), evt.getLinkedException(), 400); 
    }); 
} 

बस इस कोड को अपने जेएक्सबी बीन और अपने सभी सेट में छोड़ दें।