6

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

我添加了一个“隐藏的”ID 标签,现在提交表单时出现错误。有人可以给我一些帮助吗?

我用谷歌搜索了这个问题,看到其他人发布了类似的错误,但我不知道如何解决它。

提交表单时摘自 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)

摘自 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>

行动课节选:

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>

仅供参考 - 我也将这个问题提交给 Struts-User 分发列表,但没有收到任何输入,所以我也将在此处发布。当有更多信息可用时,我将更新另一篇文章,反之亦然。

4

5 回答 5

9

NoSuchMethodException ... ([Ljava.lang.String;)] 问题可能是由于 HTTP 请求中有多个同名的属性造成的。

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

确保动作类中只有一个 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 ...
    }
}
于 2012-02-21T12:31:24.787 回答
2

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

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

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

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

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

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

于 2011-05-03T14:25:39.557 回答
0

我的猜测是这是一个老错误。尝试升级到最新的 Ognl 版本。认为它可能是 2.7.something。最新版本在 github 上。如果您想非常确定,请在那里搜索,但我认为 2.7 应该可以工作。

于 2011-05-02T19:18:06.813 回答
0

我认为这是隐藏的问题

这个,如果你有两个页面并且如果两个页面包含相同的隐藏名称,如下所示,你会得到一个 ognl 错误,如果你在第一页保留隐藏名称并且你在第二页中使用的隐藏名称,请删除 1在第二页中删除页面(如果存在相同的隐藏名称)并运行您的程序现在不会显示任何错误。为什么是这样的意思是,可能我们已经隐藏在上一页中,并且可以在没有隐藏的第二页中使用 request.getParameter("your name"); (这里隐藏变量覆盖)。还有一个,而不是像隐藏的输入类型那样给出隐藏的输入,而是给出名称和值,我认为这是最好的。

于 2012-03-07T05:46:11.453 回答
0

我也有同样的错误兄弟。但我以某种方式找到它 1.我们不需要为从 jsp 页面接受的输入字段定义 getter setter,因为它是根据给定的名称自动映射的。2.确保您传递的变量字段不应该重复。3.在我的情况下,我通过传递一个字段(例如:userId)并提交表单(传递的参数也有userId)执行ajax调用。因此引发了错误。我将ajax调用参数的名称更改为(例如:userIdTemp),效果很好。

于 2017-10-23T06:56:02.507 回答