[Seasar-user:2812] [S2JSF]...ForEach.getCurrentRow で例外

O.K.U. oku
2005年 11月 11日 (金) 16:11:22 JST


O.K.U.です。続けて失礼します。

内容が長さの違うリスト(lla, llb)を含むリスト(ll)を展開して
表示した後、長い方のリスト(lla)に含まれて、短い方のリスト
には含まれない位置の値をブラウザで修正して submit すると
org.seasar.jsf.component.ForEach.getCurrentRow で
java.lang.ArrayIndexOutOfBoundsException が発生します。

ちょっと分りにくい説明で申し訳ないですが、添付するソースで
a3 と表示される部分を変更して submit すると例外が発生します。

java ソースで llb.add(new HogeDto("b3")); のコメントを外し、
lla と llb の長さを同じにしてやるとこの例外は発生しません。

違う長さのリストを含めてはいけないといった制約があるのでしょうか?
# だとすると結構、厳しい...
尚、検証は S2JSF 1.0.8 で行ないました。

− 例外情報 −−−−−−−−−−
[exception]
javax.servlet.ServletException: 2
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:125)
	org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:112)
	org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:47)
	org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)

[root cause]
java.lang.ArrayIndexOutOfBoundsException: 2
	org.seasar.jsf.component.ForEach.getCurrentRow(ForEach.java:99)
	org.seasar.jsf.component.ForEach.setRowIndex(ForEach.java:79)
	org.seasar.jsf.component.ForEach.broadcast(ForEach.java:131)
	org.seasar.jsf.component.ForEach.broadcast(ForEach.java:133)
	org.seasar.jsf.component.S2UIViewRoot.broadcastForPhase(S2UIViewRoot.java:104)
	org.seasar.jsf.component.S2UIViewRoot.processValidators(S2UIViewRoot.java:54)
	org.seasar.jsf.lifecycle.LifecycleImpl.processValidations(LifecycleImpl.java:159)
	org.seasar.jsf.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:81)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:109)
	org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:112)
	org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:47)
	org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:45)
	org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81)


− hoge.html −−−−−−−−−−
<html xmlns:m="http://www.seasar.org/maya">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
<title>Hoge</title>
</head>
<body>
<form>
  <span m:inject="s:forEach" m:items="#{hogeListDto.hogeList}" m:var="e" m:varindex="i">
    <span m:inject="s:forEach" m:items="#{e}" m:var="ee" m:varindex="ii">
      <input type="text" m:value="#{ee.hoge}" />
    </span>
    <br />
  </span>
  <input type="submit" value="submit"/>
</form>
</body>
</html>

− hogeDto.java −−−−−−−−−−
package examples.jsf.dto;

public class HogeDto {
    private String hoge;
    public HogeDto(){}
    public HogeDto(String hoge){
        this.hoge = hoge;
    }
    public String getHoge() {
        return hoge;
    }
    public void setHoge(String hoge) {
        System.out.println(hoge);
        this.hoge = hoge;
    }
}

− hogeListDto.java −−−−−−−−−−
package examples.jsf.dto;

import java.util.List;
import java.util.LinkedList;

public class HogeListDto {
        private List hogeList;
        public void setInit(String dummy){
            System.out.println("HogeListDto.setInit() is called.");
            LinkedList lla = new LinkedList();
            lla.add(new HogeDto("a1"));
            lla.add(new HogeDto("a2"));
            lla.add(new HogeDto("a3"));
            LinkedList llb = new LinkedList();
            llb.add(new HogeDto("b1"));
            llb.add(new HogeDto("b2"));
            //      llb.add(new HogeDto("b3")); ここのコメントを外すと例外は発生しない
            LinkedList ll = new LinkedList();
            ll.add(lla);
            ll.add(llb);
            hogeList = ll;
        }
        public List  getHogeList() {
                return hogeList;
        }
        public void setHogeList(List hogeList) {
            System.out.println("HogeListDto.setHogeList() is called.");
            this.hogeList = hogeList;
        }
}

− hoge.dicon −−−−−−−−−−
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
        "http://www.seasar.org/dtd/components21.dtd">
<components>
        <component name="hogeListDto" class="examples.jsf.dto.HogeListDto" instance="session" >
                <property name="init">"foo"</property>
        </component>
</components>



Seasar-user メーリングリストの案内