एक विधि में एक ही समय में पथ परम और एक जेसन बॉडी अनुरोध पढ़ें

जब मेरी विधि इस तरह दिखती है तो मुझे निम्न त्रुटि मिल रही है

@POST
    @Path("/share")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response shareit(@PathParam("USERID") String userID,Map paramValue){

.....
.....

}

यह ठीक काम करता है अगर मैं पैरामीटर @PathParam ("USERID") स्ट्रिंग उपयोगकर्ता आईडी या मानचित्र paramValue पैरामीटर से किसी एक को हटा देता हूं। क्या मैं पथ परम पढ़ नहीं सकता और एक ही समय में एक जेसन बॉडी अनुरोध पढ़ सकता हूं?

त्रुटि:

Dec 01, 2013 11:30:20 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /CloudServices threw load() exception
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.app.cloud.share.Share.shareit(java.lang.String,java.util.Map) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[application/json], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.rjil.cloud.share.Share, handlerConstructors=[[email protected]]}, handlingMethod=public javax.ws.rs.core.Response com.rjil.cloud.share.Share.shareit(java.lang.String,java.util.Map), parameters=[Parameter [type=class java.lang.String, source=USERID, defaultValue=null], Parameter [type=interface java.util.Map, source=null, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:427)
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:162)
    at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:287)
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289)
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286)
    at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:284)
    at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:302)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
    at javax.servlet.GenericServlet.init(GenericServlet.java:160)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3954)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
    at java.lang.Thread.run(Thread.java:744)
0

2 उत्तर

समस्या आपकी एपीआई विधि के "रिटर्न टाइप" से संबंधित प्रतीत होती है, जिसे आपने Response के रूप में परिभाषित किया है, त्रुटि संदेश देखें:

सार्वजनिक javax.ws.rs.core.Response

के प्रकार के पैरामीटर के लिए कोई इंजेक्शन स्रोत नहीं मिला

आपको अपना "प्रतिक्रिया" प्रकार निर्दिष्ट करना चाहिए (जिसे JSON ऑब्जेक्ट वापस करना है)। "अनुरोध" और "प्रतिक्रिया" प्रकारों को परिभाषित करने के लिए आप JAXB का उपयोग कर सकते हैं ( https://jaxb.java.net/), जो मूल रूप से आपको उस ऑब्जेक्ट को निर्दिष्ट करने की अनुमति देता है जो API विधि द्वारा संदेशों के "प्रारूप" को आदान-प्रदान (प्राप्त और भेजा गया) परिभाषित करता है। यह बहुत अच्छा है, क्योंकि आप JSON (लेकिन XML) और अन्य MIME प्रस्तुतियों के हैंडलिंग को स्वचालित करने की अनुमति देता है।

मुझे लगता है कि आप गलत हैं। आपने उपरोक्त त्रुटि संदेश को छोटा कर दिया है। पूर्ण त्रुटि संदेश (पठनीयता के लिए छोड़े गए पैकेज नामों के साथ) "सार्वजनिक प्रतिक्रिया Share.shareit (स्ट्रिंग, मानचित्र) प्रकार के पैरामीटर के लिए कोई इंजेक्शन स्रोत नहीं मिला है"। यह पूरी तरह से वापसी प्रकार न केवल पूरे विधि हस्ताक्षर के बारे में शिकायत कर रहा है। मैं अक्सर प्रतिक्रिया वस्तुओं को वापस करता हूं और यह ठीक है जब तक आप JSON ऑब्जेक्ट को Response.entity() के साथ प्रतिक्रिया में डालते हैं।
जोड़ा लेखक Robert Antonucci, स्रोत

ऐसा लगता है कि आपके पास {USERID} प्लेसहोल्डर किसी भी @Path एनोटेशन में परिभाषित नहीं है (यह आपकी संसाधन विधि पर नहीं है और मुझे लगता है कि यह @Path में नहीं है या तो आपके संसाधन वर्ग पर एनोटेशन)। आपको @Path में टेम्पलेट में @PathParam ("USERID") से मिलान करने की आवश्यकता है:

@Path("/share/{USERID}")
0
जोड़ा