2012-11-28 48 views
7

मेरे पास स्ट्रैट्स 2 (जेडीके 1.7, स्ट्रैट 2.2.1) एप्लिकेशन है जिसमें फ़िल्टरिंग मानदंडों की एक सूची है, जो मानचित्र में तारों के रूप में संग्रहीत है।Struts2 स्ट्रिंग सरणी में मेरी स्ट्रिंग को क्यों परिवर्तित कर रहा है?

Map< String, String > m_filters = new HashMap< String, String >(); 

public Map< String, String > getFilters() { 
    return m_filters; 
} 

मैं एक यूआरएल इस प्रकार फ़ॉर्मेट पारित:

http://myserver.com/myapp/GenerateReport.action?reportID=Whatever&filters.fromDate=0&filters.toDate=2000000000&filters.FcsType=piv_cardholder_3kp&detailed=true

हालांकि मानचित्र, दोनों कुंजी & मूल्य प्रकार स्ट्रिंग के रूप में निर्दिष्ट है इस

Map< String, String > filters = getFilters(); 
    String value = filters.get("fromDate"); 
से एक मूल्य प्राप्त करने का प्रयास

इस अपवाद को फेंकने का कारण बनता है:

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String

मैंने इसे एक यूनिट परीक्षण में पुन: उत्पन्न किया, और एक डीबगर में पुष्टि की कि स्ट्रूट्स 2 प्रत्येक पैरामीटर के लिए स्ट्रिंग के बजाय स्ट्रिंग [1] बना रहा है। यानी यह लंबाई -1 स्ट्रिंग सरणी है जिसमें एकमात्र स्ट्रिंग अपेक्षित मान (इस मामले में "0") है।

मेरा प्रश्न है: क्या यह स्ट्रूट 2 में एक बग है, या क्या मैं कुछ गलत तरीके से कर रहा हूं?

यदि यह एक बग है, तो क्या कोई ज्ञात कामकाज है?

+0

क्या आप स्ट्रिंग मान = (java.lang.String) filter.get ("fromDate") आज़मा सकते हैं; और भाग खड़ा हुआ? –

+0

खैर, समस्या यह है कि मानचित्र में स्ट्रिंग [] प्रविष्टियां हैं, स्ट्रिंग्स नहीं हैं, भले ही यह पैरामीटर (एसपी?) है <स्ट्रिंग, स्ट्रिंग> के साथ, इसलिए एक स्पष्ट कलाकार अभी भी त्रुटि का कारण बनता है। –

+1

+1 बीटीडब्ल्यू क्योंकि यह दिलचस्प था मुझे यकीन नहीं है कि इस मामले में struts2 व्यवहार सबसे समझदार है। यह सच है कि आपको निम्नलिखित सम्मेलनों का पालन करना चाहिए, लेकिन यह भी सच है कि आप जो अनुभव कर रहे हैं वह सहज नहीं है। – Quaternion

उत्तर

6

यदि आप जावा बीन सम्मेलनों का पालन करते हैं तो कोई समस्या नहीं है।

यहां कुछ दिशानिर्देश समस्या को हल करने के लिए कर रहे हैं:

  • अगर आप निजी सदस्य "फिल्टर" नाम और फिल्टर के लिए केवल एक गेटर प्रदान यह समस्या नहीं होता है।
  • यह समस्या तब नहीं होती है जब आप सार्वजनिक सेटर प्रदान करते हैं (भले ही आप निजी सदस्य जैसे m_filter के लिए एक अलग नाम का उपयोग करते हैं) गेटटर
  • के अलावा यह समस्या केवल तब होती है जब आप एक सेटर प्रदान नहीं करते हैं और संपत्ति के पास गेटटर के समान नाम नहीं है।

लंबी कहानी संक्षिप्त अनुपालन सम्मेलन। स्ट्रूट्स 2.3.4

क्या अनुमान लगा रहा है: गेटर भी सेटिंग के लिए अनुमति देता है (यदि केवल एक सेटटर था तो आप केवल एक आइटम को मानचित्र में सेट कर सकते हैं, साथ ही वर्तमान पैरामीटर के साथ इंटरसेप्टर यह मामला है)। बीन का निरीक्षण करने के लिए संपत्ति का निरीक्षण किया जाता है कि इसे टाइप रूपांतरण कैसे करना चाहिए, शायद पहले यह एक सेटटर को विफल करने की तलाश में है कि यह उस नाम की एक प्रॉपर्टी के लिए कार्रवाई को देखता है ताकि यह तय हो सके कि इसे डिफ़ॉल्ट रूप से उपयोग करने की आवश्यकता होगी। डिफ़ॉल्ट पैरामीटर प्रकार स्ट्रिंग टू स्ट्रिंग का मैपिंग है [] और यह वही है जो आप देख रहे हैं।

+0

सहमत हैं। @ शॉन डी .: सही गेटर/सेटर्स बनाएं और इसे काम करना चाहिए। –

+0

@ShawnD क्या आपने Quaternion के सुझाव का प्रयास किया था? क्या यह आपके काम आया? –

+0

यह था। मुझे लगा कि मुझे मानचित्र के लिए एक सेटटर की आवश्यकता नहीं थी क्योंकि इसे पूर्व आवंटित किया गया था, इसलिए Struts2 को मेरे लिए एक बनाने की आवश्यकता नहीं थी। हालांकि, सेटटर के बिना, * भले ही यह कभी भीटर को कॉल न करे * यह नहीं जानता कि मानचित्र के लिए किस प्रकार का उपयोग करना है और इसलिए इसे स्ट्रिंग सरणी के रूप में पास किया जाता है। अच्छी पकड़। –

0

इस प्रयास करें:

Object[] obj = (Object[]) filters.get("fromDate"); 
String value = (String)obj[0]); 
0

यह एक बग नहीं है आप विचार कर सकते हैं कि यह एक सुविधा है। Access RequestParameters

ParameterAware Interceptor

हमें लगता है /http://localhost:8080/myApp/login.action?name=struts2 & नाम चलो = चट्टानों

अगर आप नाम पैरामीटर स्ट्रिंग तक पहुँचने का प्रयास [0 ] = struts2, स्ट्रिंग 1 = चट्टान

+0

आपके दोनों पैरामीटर का एक ही नाम है। मेरा अलग-अलग चाबियों के साथ एक ही मानचित्र के नीचे प्रविष्टियां होने चाहिए। filter.fromDate पैरामीटर की सूची में एक अनूठी कुंजी है। –

+0

मेरी समझ के अनुसार struts2 पैरामीटरवेयर इस तरह से डिजाइन किया गया है कि ऊपर की स्थिति को संभालने के लिए। –

+1

पैरामीटरवेयर ऐसा लगता है कि अगर किसी को सभी अनुरोध पैरामीटर तक पहुंच की आवश्यकता है तो ऐसा लगता है। मेरे मामले में, मैं यह निर्धारित करने की कोशिश कर रहा हूं कि एक स्ट्रिंग क्यों गुजर रही है, भले ही कोई अन्य पैरामीटर न हो, यह लंबाई-1 स्ट्रिंग सरणी में परिवर्तित हो जाता है। –

4

आप गलत नोटेशन का उपयोग कर रहे हैं। filters.fromDategetFilters().setFromDate() के बराबर होगा, जो वास्तव में आप नहीं चाहते हैं। जावाबीन के लिए डॉट नोटेशन है।

filters['fromDate'] जैसे ब्रैकेट का उपयोग करने का प्रयास करें।

देखें: http://struts.apache.org/2.2.1/docs/type-conversion.html#TypeConversion-RelationshiptoParameterNames

+1

फ़िल्टर के साथ समान परिणाम (क्लासकास्ट अपवाद) ['सेडेट']। मेरा मानना ​​है कि डॉट नोटेशन मैप्स के लिए मान्य है, क्योंकि इसे तब तक कुंजी के रूप में उपयोग किया जाता है जब तक कि यह एक विशेष मूल्य (जैसे। आकार, जो मानचित्र का आकार देता है) के अनुरूप होता है। मैं अभी उस संदर्भ को नहीं ढूंढ सकता। –

+0

सुनिश्चित नहीं है कि आपको क्या कहना है। मैंने बिना किसी समस्या के ब्रैकेट सम्मेलन के साथ मैप्स को अपडेट किया है। :/ –

+0

@StevenBenitez: मानचित्र दोनों नोटेशन के साथ उपयोग किया जाता है। जैसे यहां 'session' संदर्भित करना देखें http://struts.apache.org/2.x/docs/ognl.html। –