ognl.OgnlRuntime.callAppropriateMethod中的MethodFailedException

Jus*_*tin 6 struts2 ognl

我有一个工作的Action和JSP表单,我用它在我的基本Struts 2.2.1.1应用程序中创建新实体.我正在尝试修改应用程序以重新使用相同的JSP表单来编辑实体.

我添加了一个"隐藏"的ID标签,现在我在提交表单时遇到错误.有人可以帮我一下吗?

我用Google搜索了这个问题并看到其他人发布了类似的错误,但我不确定如何解决它.

提交表单时摘自Stack Trace:

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)
Run Code Online (Sandbox Code Playgroud)

摘自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>
Run Code Online (Sandbox Code Playgroud)

动作类的摘录:

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() {
        ...
       }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
...
}
Run Code Online (Sandbox Code Playgroud)

摘自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>
Run Code Online (Sandbox Code Playgroud)

仅供参考 - 我还将此问题提交给Struts-User分发列表但未收到任何输入,因此我也将在此处发布.当有更多信息可用时,我会更新其他帖子,反之亦然.

Pet*_*erg 9

NoSuchMethodException ...([Ljava.lang.String;)]问题可能是由HTTP请求中具有相同名称的多个属性引起的.

如果具有相同名称的多个属性的情况是合法的,则可以通过将setId(int id)更改为setId(String [] idArray)并将每个数组成员字符串解析为整数来处理多个id值.

确保action类中只有一个setId方法(setId(String [] idArray)).如果有多个方法具有相同的名称但参数类型不同,那么某些版本的struts/ognl(ognl 3.0.4?)可能会混淆.

例如:

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


Jus*_*tin 2

值得注意的是,堆栈跟踪是警告,而不是错误。

此外,当表单字段实际填充数字时,不会引发警告。仅当它为空时(或者可能是用实际字符串填充时)才会引发警告和堆栈跟踪。事实上,如果 JSP 表单字段值存在(当然还有很多),则 Action 类的 POJO 模型上的 Id 字段已成功填充。

因此,我们可以忽略警告,因为它不会对我们造成任何伤害,或者将 Id 默认为某个数值,然后在 Action 类中添加逻辑来处理它。

我决定忽略该警告,并相应地调整了 log4j 级别:

# Struts OgnlUtil issues unimportant warnings
log4j.logger.com.opensymphony.xwork2.util.OgnlUtil=error
log4j.logger.com.opensymphony.xwork2.ognl.OgnlValueStack=error
Run Code Online (Sandbox Code Playgroud)

有关此主题的更详细讨论可以在此处的 Struts 用户邮件列表中找到: http://mail-archives.apache.org/mod_mbox/struts-user/201105.mbox/%3CBANLkTinCzcTGjsn1jjotBr7fE_-5CX703w@mail.gmail.com% 3E