- PR -

nestedタグ使用時の PropertyUtils.getIndexedProperty でのエラー

投稿者投稿内容
aki
会議室デビュー日: 2004/04/15
投稿数: 10
投稿日時: 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 ]
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2004-04-15 11:02
akiさん、こんにちは。
LmListFormに
-------------------
public xxx getXXX(int index){
return listBean.get(index);
}
-------------------
のように、ActionFormのプロパティであるlistBeanの
要素をインデックスで取得できるようなメソッドを追加したら
どうなりますか?
date,time,keydataといった属性を持つBeanのクラス名が分からなかったのでxxxとしています。
aki
会議室デビュー日: 2004/04/15
投稿数: 10
投稿日時: 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/05
投稿数: 20
お住まい・勤務地: 大阪
投稿日時: 2004-04-15 13:40
初期化していないListに対してセットしているからだと思います。
java.lang.IndexOutOfBoundsExceptionと同じようなエラーですねぇ。

listdataの初期化はどこで行いどこに格納してますか?
その部分だけソース書いてください。

beanutilsを使用しての単体及び、nestedTagを使用しての動作も
試してみましたがうまくいきました。
_________________
************************************
OKソフト 代表 岡田 清史
開発依頼の問い合わせは、こちらまで。
E-Mail : oksoftjp@yahoo.co.jp
************************************
aki
会議室デビュー日: 2004/04/15
投稿数: 10
投稿日時: 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 ]
aki
会議室デビュー日: 2004/04/15
投稿数: 10
投稿日時: 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/05
投稿数: 20
お住まい・勤務地: 大阪
投稿日時: 2004-04-15 22:46
setterでnullチェックをしてnullの時だけ
_listBeanを初期化してはいかがでしょうか?
_________________
************************************
OKソフト 代表 岡田 清史
開発依頼の問い合わせは、こちらまで。
E-Mail : oksoftjp@yahoo.co.jp
************************************
aki
会議室デビュー日: 2004/04/15
投稿数: 10
投稿日時: 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 ]

スキルアップ/キャリアアップ(JOB@IT)