我有一个工作的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分发列表但未收到任何输入,因此我也将在此处发布.当有更多信息可用时,我会更新其他帖子,反之亦然.
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)
值得注意的是,堆栈跟踪是警告,而不是错误。
此外,当表单字段实际填充数字时,不会引发警告。仅当它为空时(或者可能是用实际字符串填充时)才会引发警告和堆栈跟踪。事实上,如果 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
| 归档时间: |
|
| 查看次数: |
12355 次 |
| 最近记录: |