- - PR -
nestedタグ使用時の PropertyUtils.getIndexedProperty でのエラー
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2004-04-15 03:19
遅い時間に質問してすみません。
現在nestedタグを使用して、ActionFormのプロパティのbeanから データをhiddenにセットしているのですが、 実際にJSPには、 ---------------------------------------------------------- <nested:iterate id="listdata" property="listBean" indexId="index"> <nested:write property="date" /> <nested:write property="time" /> <nested:hidden property="keydata" /> </nested:iterate> ---------------------------------------------------------- と記述して実行すると htmlは ---------------------------------------------------------- 2004/04/03 10:00 <input type="hidden" name="listBean[0].keydata" value="0101"> ---------------------------------------------------------- と生成されて、表示もできてましたが、 ボタンを押下して、submitしたときに java.lang.NullPointerException org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:515) org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:428) org.apache.commons.beanutils.PropertyUtils.getNestedProperty(PropertyUtils.java:770) org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:801) org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:881) org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808) org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1252) org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:821) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) javax.servlet.http.HttpServlet.service(HttpServlet.java:763) javax.servlet.http.HttpServlet.service(HttpServlet.java:856) のエラーが発生してしまいます。 ソースの方を追っていくと PropertyUtilsの Object array = readMethod.invoke(bean, new Object[0]); if(!array.getClass().isArray()) のarrayがnullの為にエラーが発生しています。 hiddenのデータの方を次の画面で使用したいので取得したいのですが beanUtilの所で落ちてしまいます。 nested:textで試してみても結果は同じでした。 ActionFormの記述の方が間違えているのかもしれませんが・・・ そちらの記述は public class LmListForm extends ActionForm { List listBean; public List getListBean() { return listBean; } public void setListBean(List list) { listBean = list; } } listBeanは dateとtimeとkeydataのsetter getter のJavaBeanを作成 としています。 もし同じような事で悩んでいて解決した、または解決の糸口を知っている方が おられましたら、ご教授の方お願い致します。 [ メッセージ編集済み 編集者: aki 編集日時 2004-04-15 03:25 ] |
|
投稿日時: 2004-04-15 11:02
akiさん、こんにちは。
LmListFormに ------------------- public xxx getXXX(int index){ return listBean.get(index); } ------------------- のように、ActionFormのプロパティであるlistBeanの 要素をインデックスで取得できるようなメソッドを追加したら どうなりますか? date,time,keydataといった属性を持つBeanのクラス名が分からなかったのでxxxとしています。 |
|
投稿日時: 2004-04-15 12:58
レスありがとうございます。
環境の方を書いていなかったので追記しておきます。 Tomcat5.0 j2sdk1.4.2_03 struts1.1 他のサイトでも似たような形で getterにインデックスの引数を定義したメソッドを使用するとあったので 前に試してたのですが、その時できませんでした。 で、もう一度試してみたのですが・・・ 同じエラーが生じてしまいます。 一応ActionFormの方には -------------------------- public List getListBean() { return _listBean; } public XXXBean getListBean(int index) { return ((XXXBean) _listBean.get(index)); } public void setListBean(List list) { _listBean = list; } ---------------------------------------- と記述しています。 エラーの内容としてはやはり、hiddenの名前とメソッドの 同期が取れていない感じなのですが・・・ |
|
投稿日時: 2004-04-15 13:40
初期化していないListに対してセットしているからだと思います。
java.lang.IndexOutOfBoundsExceptionと同じようなエラーですねぇ。 listdataの初期化はどこで行いどこに格納してますか? その部分だけソース書いてください。 beanutilsを使用しての単体及び、nestedTagを使用しての動作も 試してみましたがうまくいきました。 _________________ ************************************ OKソフト 代表 岡田 清史 開発依頼の問い合わせは、こちらまで。 E-Mail : oksoftjp@yahoo.co.jp ************************************ |
|
投稿日時: 2004-04-15 17:23
返答ありがとうございます。
初期化が一番怪しいと思います。 最初は初期化していませんでした>_< すみません・・・・ で、 ActionFormのコンストラクタに対して nestのデータが3件ある場合に明示的に -------------------------------- public XXXForm() { _listBean = new ArrayList(); _listBean.add(new XXXBean()); _listBean.add(new XXXBean()); _listBean.add(new XXXBean()); } -------------------------------- としますと、 データの方を取得できました。 が 仮なので、どこかでインデックスを取得して初期化を行いたいのですが、 どこでインデックスを取得して初期化すればいいのでしょうか? [ メッセージ編集済み 編集者: aki 編集日時 2004-04-15 17:36 ] |
|
投稿日時: 2004-04-15 19:24
自己レスですが、
ActionFormに index を属性としてもち、 hiddenにセットして、次のActionで setterの部分で、初期化を行えば 一応動きましたが・・ もっといい方法があるような事があるような・・ 一応書いておきます・・・ ---------------------- public int getIndex() { return _index; } public void setIndex(int i) { _listBean = new ArrayList(); for (int cnt = 0; cnt < i; cnt++) { _listBean.add(new XXXBean()); } _index = cnt; } ---------------------- |
|
投稿日時: 2004-04-15 22:46
setterでnullチェックをしてnullの時だけ
_listBeanを初期化してはいかがでしょうか? _________________ ************************************ OKソフト 代表 岡田 清史 開発依頼の問い合わせは、こちらまで。 E-Mail : oksoftjp@yahoo.co.jp ************************************ |
|
投稿日時: 2004-04-15 23:07
返答ありがとうございます
始めは私もそうだとおもって、 setterの所でnullチェックを行い、なかったら初期化して ( _listBean = new ArrayList(); のみ addはしてません ) 検証してみたのですが、 その場合は、java.lang.IndexOutOfBoundsException が発生していました。 実際落ちている所は PropertyUtilsのgetIndexedPropertyで Object array = readMethod.invoke(bean, new Object[0]); を使用して getListBean() で 取得してきた オブジェクト配列に対して、indexを指定した処理をしていたので 事前にその件数だけ配列のエリアを確保しておかなければならないのかな と思いました。 というわけで、前に書いたとおり、indexはどうやって保持、又は受け取れる のかなとおもったのですが。。。 検討違いの事やっているのかな・・ ===================================================================== 以前に書いたものに関して少し間違えてたので修正しました。 // ネストの件数を取得 public int getIndex() { return _index; } // ネストの件数をセット public void setIndex(int i) { _index = i; } public List getListBean() { if (_listBean == null) { _listBean = new ArrayList(); // 事前にセットされているネストの件数分初期化 for (int cnt = 0; cnt < _index; cnt++) { _listBean.add(new XXXBean()); } } return _listBean } でも、beanutilがhiddenに格納しているindexを取得してから listBeanをgetしてくれるかどうかはstrtus側がやっている ような気がするので、先に必ずindexをセットしてくれているかどうか 順不同の場合は・・・・ [ メッセージ編集済み 編集者: aki 編集日時 2004-04-16 15:34 ] |
