2010-02-09 14 views
14

मैं सत्र स्कोप से एक डोमेन ऑब्जेक्ट (UserVO) पढ़ना चाहता हूं।स्प्रिंग 3.0 सेट करें और सत्र विशेषता प्राप्त करें

मैं एक नियंत्रक WelcomeController बुलाया में UserVO की स्थापना कर रहा हूँ

@Controller 
@RequestMapping("/welcome.htm") 
public class WelcomeController { 
@RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){ 
     User user = loginService.loginUser(loginCredentials); 
    session.setAttribute("user", user); 
     return "loginSuccess"; 
    } 
} 

मैं JSP पृष्ठों <h1>${user.userDetails.firstName}</h1>

में वस्तु का उपयोग करने में सक्षम हूँ लेकिन मैं,

एक और नियंत्रक से मूल्य को पढ़ने में सक्षम नहीं कर रहा हूँ

मैं इस प्रकार सत्र विशेषता को पढ़ने के लिए कोशिश कर रहा हूँ:

@Controller 
public class InspectionTypeController { 
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
public String addInspectionType(InspectionType inspectionType, HttpSession session) 
{ 
      User user = (User) session.getAttribute("user"); 
      System.out.println("User: "+ user.getUserDetails().getFirstName); 

     } 
} 
+0

आप कैसे असमर्थ हैं? – Bozho

+0

की सटीक समस्या क्या है अब मुझे आपके लिए एक ही समस्या है। क्या आपको कोई अन्य समाधान मिला? –

उत्तर

39

आपके द्वारा दिखाया गया कोड कार्य करना चाहिए - HttpSession नियंत्रकों के बीच साझा किया गया है, और आप एक ही विशेषता नाम का उपयोग कर रहे हैं। इस प्रकार कुछ और गलत हो रहा है कि आप हमें नहीं दिखा रहे हैं।

हालांकि, चाहे यह काम करता है या नहीं, वसंत @SessionAttribute एनोटेशन (docs देखें) का उपयोग करके सत्र में अपने मॉडल ऑब्जेक्ट्स को रखने के लिए एक और अधिक सुरुचिपूर्ण दृष्टिकोण प्रदान करता है।

उदाहरण के लिए

(मैं इस परीक्षण नहीं किया है, लेकिन यह आप विचार देता है):

@Controller 
@RequestMapping("/welcome.htm") 
@SessionAttributes({"user"}) 
public class WelcomeController { 
    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(ModelMap modelMap){ 
     User user = loginService.loginUser(loginCredentials); 
     modelMap.addtAttribute(user); 
     return "loginSuccess"; 
    } 
} 

और फिर

@Controller 
@SessionAttributes({"user"}) 
public class InspectionTypeController { 

    @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
    public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) { 
     System.out.println("User: "+ user.getUserDetails().getFirstName); 
    } 
} 

है जब आपकी मूल कोड काम नहीं कर रहा तो हालांकि,, यह या तो काम नहीं करेगा, क्योंकि आपके सत्र में कुछ और गलत है।

+1

मैं यहां पहला समाधान ढूंढ रहा था ('@ सत्र एट्रिब्यूट्स ') और मुझे जो कुछ मिला वह' java.lang.IleglegalStateException: प्रतिक्रिया के बाद एक सत्र नहीं बना सकता है –

+1

ऐसा लगता है कि @karpaczio क्या कहता है ... क्या कोई पुष्टि कर सकता है कि कौन सा सही है? मुझे लगता है कि सत्र में 'नियंत्रक' के बावजूद सत्र विशेषताओं को साझा किया जाता है, लेकिन मैंने '@ सत्र एट्रिब्यूट' के आंतरिक कार्यकलापों में शामिल नहीं किया है। – Andy

+2

@Andy karpaczio के उत्तर पर मेरी टिप्पणी देखें –

6

@ सत्र एट्रिब्यूट केवल विशेष हैंडलर के संदर्भ में काम करता है, इसलिए वेलकम कंट्रोलर में सेट विशेषता केवल इस नियंत्रक में दिखाई देगी।

+5

आप जो कह रहे हैं वह वसंत संस्करण <= 3.1.2.RELEASE के मामले में है। 3.1.2.RELEASE से शुरू हो रहा है, @ सत्र एट्रिब्यूट्स विभिन्न नियंत्रकों के बीच बने रहेंगे क्योंकि –

+1

@ डेनिस नियाज़ेव [यहां] देखें [http://docs.spring.io/spring-framework/docs/3.2.0.M2/api/ org/springframework/वेब/बाँध/एनोटेशन/SessionAttributes।एचटीएमएल) इस तरह के वार्तालाप विशेषताओं के लिए सत्र एट्रिब्यूट्स का उपयोग करें जिन्हें एक विशिष्ट हैंडलर वार्तालाप के दौरान अस्थायी रूप से सत्र में संग्रहीत किया जाना चाहिए। स्थायी सत्र विशेषताओं के लिए, उदा। उपयोगकर्ता प्रमाणीकरण ऑब्जेक्ट, इसके बजाय पारंपरिक session.setAttribute विधि का उपयोग करें। – lolotron

2

सभी नियंत्रकों के उत्तराधिकारी के लिए अभिभावक वर्ग का उपयोग करें और वहां पर सत्र सामग्री का उपयोग करें। बस यह वर्ग एमवीसी के पैकेज स्कैन में होना चाहिए।

0

हो सकता है कि आपने अपना यूजरवीओ सीरियलज़ेबल के रूप में सेट न किया हो।

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