2011-05-02 25 views
6

में MethodFailedException में मेरे पास एक कार्यरत क्रिया और जेएसपी फॉर्म है जिसका उपयोग मैं अपने मूल स्ट्रैट 2.2.1.1 ऐप में नई इकाइयों को बनाने के लिए कर रहा हूं। मैं इकाइयों के संपादन के लिए एक ही जेएसपी फॉर्म का पुनः उपयोग करने के लिए ऐप को संशोधित करने की कोशिश कर रहा हूं।ognl.OgnlRuntime.callAppropriateMethod

मैंने एक "छुपा" आईडी टैग जोड़ा और अब जब मैं फॉर्म जमा करता हूं तो मुझे त्रुटियां मिल रही हैं। क्या कोई मुझे कुछ सहायता दे सकता है?

मैंने इस समस्या को गुगल किया है और दूसरों को समान त्रुटियों को पोस्ट किया है, लेकिन मुझे यकीन नहीं है कि इसे कैसे हल किया जाए। JSP से

2011-05-02 11:09:36,132 3198497 ["http-bio-8080"-exec-23] WARN 
com.opensymphony.xwork2.ognl.OgnlValueStack - Error setting expression 
'id' with value '[Ljava.lang.String;@100ac03' 
ognl.MethodFailedException: Method "setId" failed for object 
[email protected] [name='null' ] 
[java.lang.NoSuchMethodException: 
org.robbins.flashcards.model.Tag.setId([Ljava.lang.String;)] 
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1285) 
    at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1474) 

अंश:

<%@ taglib prefix="s" uri="/struts-tags"%> 
... 
<s:form action="saveOrUpdateTag" method="post"> 
    <s:hidden name="id" /> 
    <s:textfield name="name" key="label.tag.name" size="20" /> 
    <s:submit label="label.flashcard.submit" align="center" /> 
</s:form> 

कार्रवाई कक्षा से अंश:

public class TagAction extends FlashCardsAppBaseAction implements 
ModelDriven<Tag> { 

    Tag tag = new Tag(); 

    public Tag getTag() { 
     return tag; 
    } 

    public void setTag(Tag tag) { 
     this.tag = tag; 
    } 
    public String createTag() { 
     ... 
     } 
} 

POJO से अंश: स्टैक ट्रेस से

अंश जब मैं प्रपत्र सबमिट

public class Tag implements java.io.Serializable { 


    private int id; 
    private String name; 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
... 
} 
Struts.xml

से

अंश

<action name="saveOrUpdateTag" 
      class="org.robbins.flashcards.presentation.TagAction" 
      method="createTag"> 
     <result name="success" type="tiles">displaytag.tiles</result> 
     <result name="input" type="tiles">tagform.tiles</result> 
    </action> 

FYI करें - मैं भी इस सवाल का Struts-उपयोगकर्ता वितरण सूची को प्रस्तुत लेकिन इसलिए मैं यहाँ भी पोस्ट करने के लिए जा रहा हूँ किसी भी इनपुट नहीं मिला है। जब मैं अधिक जानकारी उपलब्ध हूं तो मैं दूसरी पोस्ट अपडेट करूँगा और इसके विपरीत।

उत्तर

2

स्टैक ट्रेस को ध्यान में रखना एक चेतावनी है, त्रुटि नहीं है।

साथ ही, जब फ़ील्ड फ़ील्ड वास्तव में किसी संख्या के साथ आबादी में है तो चेतावनी नहीं फेंक दी जाती है। केवल तभी जब यह खाली होता है (या संभवतः यदि यह वास्तविक स्ट्रिंग के साथ आबादी वाला होता है) चेतावनी और स्टैक ट्रेस फेंक दिया जाता है। वास्तव में, एक्शन क्लास के लिए पीओजेओ मॉडल पर आईडी फ़ील्ड जेएसपी फॉर्म फ़ील्ड वैल्यू के साथ सफलतापूर्वक आबादी में है, यदि यह मौजूद है (और कई कोर्स)।

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

मैं चेतावनी को अनदेखा करने का फैसला किया है और मैं उसके अनुसार मेरी log4j स्तर समायोजित किया है: http://mail-archives.apache.org/mod_mbox/struts-user/201105.mbox/%[email protected]%3E

+0

यह सुनिश्चित नहीं है कि मुझे वास्तव में अपने प्रश्न का उत्तर देना है, लेकिन मुझे लगा कि मैं इस समस्या से निपटने का फैसला करने के साथ एक उत्तर पोस्ट करूंगा। (मैं अभी भी स्टैक ओवरफ्लो पर नया हूं) – Justin

0

मेरा अनुमान है कि यह एक पुरानी बग है। नवीनतम ओग्नल रिलीज में अपग्रेड करने का प्रयास करें। सोचो कि यह 2.7 कुछ हो सकता है। सबसे वर्तमान संस्करण github पर है। अगर आप बहुत यकीन करना चाहते हैं तो वहां खोजें लेकिन 2.7 काम करना चाहिए जो मुझे लगता है।

+0

आपके इनपुट उपयोगकर्ता 571885 के लिए धन्यवाद। मैं ognl-3.0.jar का उपयोग कर रहा था और तब से इसे नवीनतम संस्करण के साथ बदल दिया है जिसे मैं ओग्नल-3.0.1.jar था। मैंने इसे maven2 भंडार पर पाया। मैंने इसे गितूब पर नहीं देखा। शायद मैं गलत जगह पर देख रहा था? किसी भी मामले में, मुझे अभी भी नए जार के साथ एक ही त्रुटि मिल रही है। किसी भी विचार का बहुत आभार माना जाएगा। – Justin

9
:

# Struts OgnlUtil issues unimportant warnings 
log4j.logger.com.opensymphony.xwork2.util.OgnlUtil=error 
log4j.logger.com.opensymphony.xwork2.ognl.OgnlValueStack=error 

इस विषय पर अधिक विस्तृत चर्चा Struts उपयोगकर्ता मेलिंग सूची यहां पाया जा सकता है

NoSuchMethodException ... ([Ljava.lang.String;)] HTTP अनुरोध में एक ही नाम के साथ कई विशेषताओं के कारण समस्या हो सकती है।

यदि एक ही नाम के साथ कई विशेषताओं वाले मामले वैध हैं, तो आप सेट आईडी (स्ट्रिंग [] idArray) सेट करने के लिए setId (int id) को बदलकर एकाधिक आईडी मानों को संभाल सकते हैं और प्रत्येक सरणी सदस्य स्ट्रिंग को पूर्णांक के रूप में पार्स कर सकते हैं।

सुनिश्चित करें कि एक्शन क्लास में केवल एक सेट आईडी विधि (setId (स्ट्रिंग [] idArray) है। ऐसा लगता है कि स्ट्रैट्स/ओग्नल (ओग्नल 3.0.4?) के कुछ संस्करण उलझन में आ सकते हैं यदि समान नाम के साथ कई विधियां हैं लेकिन विभिन्न पैरामीटर प्रकार हैं।

उदाहरण के लिए:

public void setId(String[] idArray) { 
    for (String idString : idArray) { 
     int id = Integer.parseInt(idString); 
     ... handle different id values somehow ... 
    } 
} 
0

मुझे लगता है कि यह

इस, की तरह छिपा हुआ कुछ की समस्या है अगर आप दो पृष्ठों और अगर दो पृष्ठों इस तरह एक ही छिपा का नाम शामिल है, नीचे में दिखा आपको उस ओग्नल त्रुटि मिलेगी, जैसे कि आपने पहले पृष्ठ में छुपा नाम रखा है और दूसरे पृष्ठ में हटाए गए छिपे हुए नाम (यदि एक ही छिपे हुए नाम मौजूद हैं) को हटाएं और आपको प्रोग्राम चलाएंगे तो 1 ऐसा कुछ हटा दें कोई त्रुटि नहीं दिख रहा है। यह इस तरह क्यों है, शायद हम पहले से ही पिछले पृष्ठ में छिपाए गए हैं और अनुरोध के साथ दूसरे पृष्ठ में छिपे बिना उपयोग करना संभव है .getParameter ("आपका नाम"); (यहां छुपे हुए चरम ओवर-राइट)। और इनपुट प्रकार छिपाए गए इनपुट को छिपाने के बजाय एक और अधिक नाम और मूल्य मुझे सबसे अच्छा लगता है।

0

मैं भी bro.but मैं किसी भी तरह यह 1. हम इनपुट क्षेत्र है कि jsp पेज से स्वीकार कर रहे हैं के लिए गेटर सेटर परिभाषित की जरूरत नहीं मिल ही त्रुटि थी क्योंकि यह है दिए गए नाम के आधार पर स्वचालित रूप से मैप किया गया। 2. सुनिश्चित करें कि आपके द्वारा गुजरने वाले वेरिएबल फ़ील्ड को अनावश्यक नहीं होना चाहिए। 3. माइकेस में मैं एक फ़ील्ड पास करने के साथ एक AJAX कॉल करता हूं (उदाहरण: userId) और फॉर्म सबमिट करने पर (पैरामीटर पास करने में उपयोगकर्ता आईडी भी है)। इस कारण त्रुटि को फेंक दिया गया था। इसलिए मैंने AJAX कॉल पैरामीटर का नाम बदल दिया (उदाहरण: userIdTemp), यह अच्छी तरह से काम करता है।