MethodFailedException in ognl.OgnlRuntime.callAppropriateMethod

Justin picture Justin · May 2, 2011 · Viewed 13.3k times · Source

I have a working Action and JSP form that I'm using for creating new entities in my very basic Struts 2.2.1.1 app. I'm trying to modify the app to re-use the same JSP form for the editing of entities.

I added a "hidden" ID tag and now I'm getting errors when I submit the form. Can someone please give me some assistance?

I've Googled this issue and seen others posting similar errors but I'm not sure how to resolve it.

Excerpt from Stack Trace when I submit the form:

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
org.robbins.flashcards.model.Tag@1b9eb34 [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)

Excerpt from JSP:

<%@ 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>

Excerpt from Action Class:

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() {
        ...
       }
}

Excerpt from 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;
    }
...
}

Excerpt from 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 - I also submitted this question to the Struts-User distribution list but haven't received any input so I'm going to post it here also. I'll update the other post and vice versa when more info is available.

Answer

Peter Lamberg picture Peter Lamberg · Feb 21, 2012

The NoSuchMethodException ... ([Ljava.lang.String;)] problem can be caused by having multiple attributes with the same name in the HTTP request.

If the case with multiple attributes with the same name is legitimate, you can handle multiple id values by changing setId(int id) to setId(String[] idArray) and parsing each array member string as an integer.

Make sure there is only one setId method (setId(String[] idArray)) in the action class. It seems some versions of struts/ognl (ognl 3.0.4?) can get confused if there are multiple methods with same name but different parameter types.

For example:

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