2012-04-05 17 views
24

मैं वसंत के साथ एक शॉपिंग कार्ट को कार्यान्वित करना चाहता हूं, इसलिए मुझे सत्र में Cart (जिसमें उत्पादों, भुगतान प्रकार और डिलीवरी टाइप जैसी विशेषताएं हैं) को सहेजने की आवश्यकता है। मैंने इसे बीन और विशेषता "स्कोप" के साथ "सत्र" पर सेट करने का प्रयास किया है, लेकिन यह अभी काम नहीं करता है, क्या मुझे अपने नियंत्रक या Cart कक्षा में कुछ अतिरिक्त एनोटेशन का उपयोग करना चाहिए? कोई भी उदाहरण उपयोग वास्तव में सहायक होगा :-) अग्रिम धन्यवाद।सत्र में स्प्रिंग स्टोर ऑब्जेक्ट

उत्तर

26
@Component 
@Scope("session") 
public class Cart { .. } 

और फिर

@Inject 
private Cart cart; 

काम करना चाहिए, अगर यह वेब संदर्भ (डिस्पैचर-servlet.xml) में घोषित किया जाता है। क्योंकि आपके नियंत्रक सिंगलटन scoped (डिफ़ॉल्ट रूप से) है, तो समस्या संभवत हो रहा है आप अपने नियंत्रक में सीधे खरीदारी की टोकरी इंजेक्शन लगाने रहे हैं, तो

@RequestMapping(..) 
public String someControllerMethod(HttpSession session) { 
    session.addAttribute(Constants.CART, new Cart(); 
    ... 
    Cart cart = (Cart) session.getAttribute(Constants.CART); 
} 
+0

हां, "एक वैकल्पिक विकल्प" काम करता है, लेकिन मैं इसका उपयोग नहीं करना चाहता हूं। जब मैं अपने नियंत्रक में एक निजी विशेषता कार्ट बनाता हूं तो मुझे त्रुटि मिलती है कि "निर्भरता के लिए कोई मिलान बीन नहीं मिला: कम से कम 1 बीन जो इस निर्भरता के लिए ऑटोवायर उम्मीदवार के रूप में अर्हता प्राप्त करता है। निर्भरता एनोटेशन: {@ org.springframework.beans.factory.annotation.Autowired (आवश्यक = सत्य)} "। बीन को applicationContext.xml में ? – tomaszf

+1

नहीं। Dispatcher-servlet.xml में। या, जैसा कि मैंने दिखाया - एनोटेशन – Bozho

+0

हम्म के साथ घोषित किया गया, लेकिन जब मैं एनोटेशन का उपयोग करता हूं, प्रेषक-servlet.xml में बीन परिभाषा के बिना मुझे पहले पेस्ट करने में त्रुटि मिलती है, साथ ही जब मैं एनोटेशन का उपयोग करता हूं और मैं बीन को परिभाषित करता हूं तो मुझे केवल उस नियंत्रक के साथ 404 मिलते हैं। – tomaszf

13

: एक वैकल्पिक विकल्प के लिए अपरिष्कृत सत्र का उपयोग करें और आपकी गाड़ी वस्तु डाल करने के लिए है , जो बीन की तुलना में व्यापक दायरा है जिसे आप इंजेक्शन दे रहे हैं। यह उत्कृष्ट लेख आपको चार दृष्टिकोणों का एक अवलोकन देता है जो आप करने की कोशिश कर रहे हैं: http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html

यहाँ समाधान की एक त्वरित सारांश है:

  1. स्कोप सत्र दायरे (नियंत्रक स्तर पर उपयोग @scope("session")) के नियंत्रक और बस नियंत्रक में खरीदारी की टोकरी उदाहरण है।
  2. नियंत्रक को अनुरोध करने के लिए स्कोप करें और सत्र-स्कोप्ड शॉपिंग कार्ट इंजेक्शन दिया गया है।
  3. बस सीधे सत्र का उपयोग करें - प्रकार की गन्दा, आईएमओ।
  4. वसंत की एनोटेशन <aop:scoped-proxy/> का उपयोग करें।

सभी विधियों में उनके पेशेवर और विपक्ष हैं। मैं आमतौर पर विकल्प 2 या 4. विकल्प के साथ जाने के 4 वास्तव में बहुत सरल है और केवल दृष्टिकोण मैं documented by Spring. देखा है

+0

सही यूआरएल http: // richardchesterwood है। blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html – Gilead

+0

धन्यवाद @ गिलाद। मैंने सही यूआरएल के साथ अद्यतन किया। –

+0

नोट, समाधान # 4 के साथ, किसी भी विधि पर अंतिम का उपयोग न करें। ऐसा करें और वह एक्सेसर सिंगलटन होगा, सत्र में नहीं, क्योंकि एओपी फाइनल को रोक नहीं सकता है। –

2

तुम बस सत्र और प्रॉक्सी मोड के साथ नीचे के रूप में स्कोप एनोटेशन जोड़ने की जरूरत है

@Component 
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) 
public class ShoppingCart implements Serializable{ 
} 

कहाँ कभी आप खरीदारी की टोकरी वस्तु उपयोग करने की आवश्यकता है, तो आप कर सकते हैं autowire यह

@Service 
public class ShoppingCartServiceImpl implements ShoppingCartService { 
    Logger logger = LoggerFactory.getLogger(ShoppingCartServiceImpl.class); 


    @Autowired 
    ShoppingCart shoppingCart; 
} 

प्रकटीकरण: मैं एक नमूना परियोजना है, जो वसंत MVC, AngularJS और बूटस्ट्रैप कि वसंत सत्र गुंजाइश प्रदर्शित का उपयोग करता है विकसित किया है -
+०१२३५१६४१०६१https://github.com/dpaani/springmvc-shoppingcart-sample

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