2009-09-03 8 views
13

@ सत्र एट्रिब्यूट्स को किस सटीक परिस्थितियों में मंजूरी मिलती है? किसी पृष्ठ में दो मॉडल का उपयोग करने का प्रयास करते समय मुझे कुछ भ्रमित व्यवहार की खोज हुई है।स्प्रिंगएमवीसी में @ सत्र एट्रिब्यूट कब हटाया जाता है? (कोड नमूना के साथ)

जब मैं एक इस नियंत्रक का उपयोग कर एक पोस्ट के बाद मिलता है ...

@Controller 
@RequestMapping("/myPage*") 
@SessionAttributes(value = {"object1", "object2"}) 
public class MyController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String get(Model model) { 
     model.addAttribute("object1", new Object1()); 
     model.addAttribute("object2", new Object2()); 
     return "myPage"; 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String post(@ModelAttribute(value = "object1") Object1 object1) { 
     //do something with object1 
     return "myPage"; 
    } 
} 

... object2 मॉडल से साफ़ हो जाता है। यह अब @ सत्र एट्रिब्यूट के रूप में मौजूद नहीं है और मेरे दृश्य पृष्ठ पर नहीं पहुंचा जा सकता है।

लेकिन अगर दूसरी विधि के हस्ताक्षर इस के लिए संशोधित किया गया है ...

public String post(@ModelAttribute(value = "object1") Object1 object1, 
        @ModelAttribute(value = "object2") Object2 object2) { 

... तो object2 मॉडल से मंजूरी दे दी नहीं प्राप्त करता है और मेरे विचार पृष्ठ पर उपलब्ध है।

@SessionAttributes के लिए जावाडोक का कहना है:

... गुण एक बार हटा दिया जाएगा हैंडलर अपने संवादी सत्र के पूरा होने का संकेत है।

लेकिन मुझे नहीं लगता कि मैंने पहले उदाहरण में बातचीत सत्र के पूरा होने का संकेत दिया है, लेकिन दूसरे उदाहरण में नहीं।

क्या कोई इस व्यवहार को समझा सकता है या यह एक बग है?

+0

यह समस्या अब वसंत 3.0rc1 में हल किया गया है। Http://jira.springsource.org/browse/SPR-6084 धन्यवाद जुर्गेन देखें! –

उत्तर

14

आप

SessionStatus.setComplete

public void post(...., SessionStatus status) { 
    status.setComplete(); 
} 

कहा फोन करके बातचीत के पूरा होने का संकेत मिलता है, मैं देख नहीं क्यों तुम एक मॉडल विशेषता और अन्य नहीं खो जाना चाहिए है।

@ModelAttribute("object1") 
public Object object1() { return new Object(); } 

@ModelAttribute("object2") 
public Object object2() { return new Object(); } 

और देखते हैं कि कैसे हाथ से मॉडल में विशेषताओं डाल करने के लिए तुलना:

आप की तरह कुछ कर रही कोशिश की है।

+1

मैंने आपके सुझाव की कोशिश की - और आश्चर्यजनक रूप से यह काम करता है! अब मैं वास्तव में उलझन में हूँ। मॉडल विशेषता को मैन्युअल रूप से सेट करने और @ModelAttribute का उपयोग करके इसे सेट करने में कोई अंतर क्यों है? –

+2

अलास मैंने एक बू-बू बनाया। संदर्भ से (3.0.0.एम 3): "नोट: @ModelAttribute एनोटेटेड विधियों को चुने गए @RequestMapping एनोटेटेड हैंडलर विधि से पहले निष्पादित किया जाएगा"। इसलिए काम करने का कारण यह है कि ऑब्जेक्ट 1 और ऑब्जेक्ट 2 विधियां दोनों प्राप्त और पोस्ट विधियों से पहले निष्पादित की जाती हैं। यह वास्तव में आप जो चाहते हैं हो सकता है, लेकिन मुझे संदेह नहीं है। – ptomli

+0

हां मुझे एहसास हुआ कि मैंने अपनी टिप्पणी पोस्ट करने के बाद ही। मैं इसे वसंत के साथ उठा सकता हूं क्योंकि मुझे इस व्यवहार के लिए कोई उचित स्पष्टीकरण नहीं दिख रहा है। –

1

आप इस तरह ही सत्र स्तर ModelAttribute निकाल सकते हैं:

को देखते हुए ModelMap model, HttpSession session और आप करते हैं:

if (categoryId != null) 
    model.addAttribute("categoryId", categoryId); 
else { 
    model.remove("categoryId"); 
    session.removeAttribute("categoryId"); 
}