के साथ दो बार बुलाया जब मैं कस्टम HandlerInterceptor
का उपयोग कर रहा हूं और मेरा नियंत्रक DeferredResult
लौटाता है, तो preHandle
प्रत्येक कस्टम अनुरोधकर्ता को दो बार अनुरोध किया जाता है। एक खिलौना उदाहरण पर विचार करें।स्प्रिंग एमवीसी इंटरसेप्टर हैंडलर ने डेफर्रेड रीसल्ट
मेरे कस्टम इंटरसेप्टर:
public class MyInterceptor implements HandlerInterceptor {
static int i = 0;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(i++);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
मेरे वसंत जावा विन्यास:
@Configuration
@EnableWebMvc
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
मेरे नियंत्रक:
@Controller
public class MyController {
@RequestMapping(value = "/test", method = RequestMethod.GET)
public DeferredResult<String> test() {
DeferredResult<String> df = new DeferredResult<String>();
df.setResult("blank");
return df;
}
}
तो, प्रत्येक पृष्ठ लोड पर मैं preHandle
विधि से दो outputs देखना । हालांकि, अगर मैं "खाली" टेम्पलेट (DeferredResult
के बजाय "रिक्त" टेम्पलेट के साथ) को वापस करने के लिए MyController
संशोधित करता हूं, तो मुझे प्रत्येक पृष्ठ लोड पर preHandle
से केवल एक आउटपुट दिखाई देता है।
तो, मेरा प्रश्न यह है कि preHandle
दो बार बुलाया जाता है जब मैं DeferredResult
का उपयोग करता हूं और क्या इससे बचना संभव है?
देखें [इस] (http://stackoverflow.com/questions/15357990/understanding-the-spring-mvcs-deferredresult-class-in-the-context-of-the-spring) जो व्यवहार में विस्तार से समझाया गया है। –
@JavaBond क्या आप कुछ और विवरण प्रदान कर सकते हैं, क्योंकि मुझे उस पोस्ट से स्पष्टीकरण नहीं मिला है। –
[स्वीकृत उत्तर] से उद्धृत (http://stackoverflow.com/a/15384965/1910582) 'काफी बोल रहा है। एक DeferredResult एक खुले अनुरोध से जुड़ा हुआ है। जब अनुरोध पूरा हो जाता है, तो DeferredResult को मानचित्र से हटा दिया जाता है, और उसके बाद, ग्राहक एक नए लंबे मतदान अनुरोध को जारी करता है, जो एक नया DeferredResult उदाहरण जोड़ता है जिसका अर्थ है क्लाइंट द्वारा एक नया अनुरोध जारी किया जाता है जिस पर 'DeferredResult' संलग्न है प्रतिक्रिया। जो बदले में बताता है कि आपके पास प्रत्येक अनुरोध के लिए दो इंटरसेप्टर आमंत्रण क्यों हैं। अगर आपको और स्पष्टीकरण की आवश्यकता है तो मुझे बताएं। –