6

非常に基本的なStruts2.2.1.1アプリで新しいエンティティを作成するために使用しているアクションとJSPフォームがあります。エンティティの編集に同じJSPフォームを再利用するようにアプリを変更しようとしています。

「非表示」のIDタグを追加しましたが、フォームを送信するとエラーが発生します。誰か助けてくれませんか?

私はこの問題をグーグルで検索し、他の人が同様のエラーを投稿しているのを見ましたが、それを解決する方法がわかりません。

フォームを送信するときのスタックトレースからの抜粋:

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)) が 1 つしかないことを確認します。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 フォーム フィールドの値が存在する場合 (もちろんいくつか) が正常に入力されます。

したがって、Warning は害を及ぼさないので無視するか、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.何かだと思います。最新バージョンは github にあります。確実に確認したい場合はそこで検索してください。ただし、2.7でうまくいくはずです。

于 2011-05-02T19:18:06.813 に答える
0

私はそれが隠された何かの問題だと思います

この場合、2 つのページがあり、2 つのページにこのような同じ隠し名前が含まれている場合、以下に示すように、その ognl エラーが発生します。最初のページに隠し名前を保持し、2 番目に使用している隠し名前を保持している場合のように、1 を削除します2ページ目のページを削除し(同じ隠し名前が存在する場合)、プログラムを実行すると、エラーが表示されなくなります。なぜこのようになるのかというと、おそらく前のページですでに非表示にしていて、2 ページ目で非表示にせずに request.getParameter("your name"); で使用できる可能性があります。(ここでは隠し変数の上書き)。もう1つ、入力タイプが非表示のように入力を非表示にし、名前と値を指定するのが最善だと思います。

于 2012-03-07T05:46:11.453 に答える