2012-11-10 9 views
9

मैं एक RESTful वेब सेवा, जर्सी का उपयोग कर लिखा है, कि इस तरह दिखता है:जर्सी बाकी में खाली/बातिल अनुरोध पेलोड को संभालने के लिए कैसे

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
public Response myAction(RequestObject requestObject) { 
    // do some action 
} 

अनुरोध वस्तु सिर्फ एक सरल डीटीओ:

public class RequestObject implements Serializable { 
    private String theString; 

    // Getter for member 
} 

जब मैं एक खाली अनुरोध पेलोड के साथ एक पोस्ट करने की कोशिश कर रहा हूं, तो मैं उम्मीद कर रहा था कि अनुरोध ऑब्जेक्ट या तो शून्य होगा, या स्ट्रिंग शून्य होगी। इसके बजाय मैं इस मिल:

मूल कारण

java.io.EOFException: No content to map to Object due to end of input 
    org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2766) 
    org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2682) 
    org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1308) 
    org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419) 
    com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139) 
    com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:483) 
    com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) 
    com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) 
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) 
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203) 
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) 
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1480) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1411) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350) 
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 



मैं एक अनुरोध पेलोड है कि इस मैं करने के वांछित परिणाम (theString अशक्त के लिए सेट है) की तरह दिखता है .:

{}
साथ पोस्ट करते हैं


प्रश्न: क्या खाली अनुरोध पेलोड स्वीकार करने का कोई तरीका है, और सर्वर पक्ष पर इसे संभालने का कोई तरीका है?

नोट: मैं पीओजेओ समर्थन जर्सी ऑफ़र का उपयोग कर रहा हूं।

<servlet> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
      <param-value>true</param-value> 
     </init-param> 
</servlet> 
+1

एक 'DefaultValue' एनोटेशन जोड़ने का प्रयास करें। इस तरह: 'सार्वजनिक प्रतिक्रिया myAction (@DefaultValue ("{}") RequestObject requestObject) '। जब यह मौजूद नहीं है तो यह आपके पैरामीटर में एक खाली JSON ऑब्जेक्ट इंजेक्ट करेगा। – toniedzwiedz

+0

मैंने वास्तव में ऐसा करने की कोशिश की है, लेकिन यह काम नहीं करता है। मुझे – ulejon

+0

से पहले ठीक उसी परिणाम मिलते हैं, इस मामले में, आप एक सर्वलेट फ़िल्टर को कार्यान्वित कर सकते हैं और अनुरोध को संसाधित कर सकते हैं, जर्सी प्राप्त करने से पहले अपने शरीर को भरना। – toniedzwiedz

उत्तर

1

कंटेनररक्वेटफिल्टर को लागू करने का प्रयास करें और अगर पेलोड शून्य हो तो अनुरोध को निरस्त करें।

requestContext.abortWith(Response.status(Response.Status.BAD_REQUEST) 
       .entity("Payload is null") 
       .build()); 

अधिक जानकारी पाया जा सकता है here

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