Search code examples
struts2ognl

MethodFailedException in ognl.OgnlRuntime.callAppropriateMethod


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.


Solution

  • It is worth noting the stack trace is a Warning, not an Error.

    Also, the Warning is not thrown when the form field is actually populated with a number. Only when it is blank (or presumably if it were populated with an actual string) is the Warning and stack trace thrown. In fact, the Id field on the POJO model for the Action class is successfully populated with the JSP form field value if it is present (and a number of course).

    Therefore, we can either ignore the Warning since it is not doing us any harm or default the Id to some numeric value and then add logic in our Action class to deal with it.

    I've decided to ignore the warning and I have adjusted my log4j level accordingly:

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

    More detailed discussion on this topic can be found in the Struts User mailing list here: http://mail-archives.apache.org/mod_mbox/struts-user/201105.mbox/%3CBANLkTinCzcTGjsn1jjotBr7fE_-5CX703w@mail.gmail.com%3E