मेरे जावा वसंत REST API नियंत्रक इस तरह दिखता है:@RequestBody का उपयोग करते हुए और एक अन्य समाप्ति बिंदु को अग्रेषण फेंकता अपवाद स्ट्रीम बंद कर दिया
Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Stream closed; nested exception is java.io.IOException: Stream closed
यह इसलिए होता है क्योंकि मैं चाहता हूँ:
public void signup(@RequestBody RequestBody requestBody) throws IOException, ServletException {
मैं इस अपवाद अनुरोध निकाय को अनुरोध बॉडी क्लास (जो अनुरोध इनपुट स्ट्रीम खोलता है और इसे खत्म करता है) को प्रस्तुत करता है, और आगे/इसे दूसरे एंडपॉइंट पर रीडायरेक्ट भी करता है।
वास्तविक नियंत्रक है:
@RequestMapping(value = "/signup", method = RequestMethod.POST)
public void signup(@RequestBody CustomUserDetails user, HttpServletRequest request, HttpServletResponse response) {
String userName = user.getUsername();
logger.debug("User signup attempt with username: " + userName);
try{
if(customUserDetailsService.exists(userName))
{
logger.debug("Duplicate username " + userName);
userName + " already exists");
String newUrl = "login";
RequestDispatcher view = request.getRequestDispatcher(newUrl);
view.forward(request, response);
} else {
customUserDetailsService.save(user);
authenticateUserAndSetSession(user, response);
}
} catch(Exception ex) {
}
}
मैं इस संभाल चाहिए?
आप धारावाहिक वस्तु के स्थान पर अनुरोध क्यों चाहिए? आप 'HttpServletRequest' को नहीं डाल सकते हैं क्योंकि यह स्पष्ट रूप से' अनुरोधबॉडी 'उदाहरण नहीं है। आपको अनुरोध को पार्स करने की आवश्यकता होगी (यानी 'इनपुटस्ट्रीम' पढ़ें और उसे अपनी ऑब्जेक्ट में कनवर्ट करें)। लेकिन उन्हें जोड़ना केवल काम करना चाहिए (यदि आपको ऐसा कुछ नहीं करना चाहिए जो आपको पहले स्थान पर नहीं करना चाहिए)। –
नहीं, यह काम नहीं करता है। मैंने विधि हस्ताक्षर के लिए @RequestBody, HttpServletReques, HttpServletResponse जोड़ने की कोशिश की और बाद में यह इनपुट स्ट्रीम पढ़ने में विफल रहा, जब मैंने पहले तर्क (अनुरोधबॉडी) को हटा दिया। मैं नियंत्रक में जाली अनुरोधबॉडी ऑब्जेक्ट को पढ़ना चाहता हूं और इसे किसी अन्य नियंत्रक को अग्रेषित करना चाहता हूं। –
आप इनपुट स्ट्रीम (दोबारा) नहीं पढ़ सकते हैं क्योंकि इसे केवल एक बार उपभोग किया जा सकता है। आप फिर से इनपुट स्ट्रीम क्यों पढ़ रहे हैं। (और मुझ पर भरोसा करें कि यह कई परियोजनाओं पर इसका उपयोग कर रहा है)। –