[JSF-70] m:immediate="true"のイベントで発生した例外をハンドリングすると、NullPointerExceptionが発生 Created: 2007-08-17  Updated: 2007-08-24  Resolved: 2007-08-24

Status: Resolved
Project: S2JSF
Component/s: None
Affects Version/s: 1.1.2, 1.0.26
Fix Version/s: 1.1.3, 1.0.27

Type: Bug Priority: Major
Reporter: cero-t Assignee: cero-t
Resolution: Fixed Votes: 0
Labels: None


 Description   

・m:immediate="true"時のAction
・中で例外が発生してErrorPageManagerImplでハンドリング
・遷移元ページにForEachがある
という状況でNullPointerExceptionが発生する問題。

errorpage/pageTran1.htmlを、こんな風にする。

<html xmlns:m="http://www.seasar.org/maya"
m:extends="/WEB-INF/layout/layout.html">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31j" />
<title>The page transition with exception</title>
</head>
<body>

<span m:inject="f:param" m:name="layoutTitle" m:value="The page transition with exception"/>
<span m:inject="s:insert" m:name="body">

<form>
<table border="1">
<tr bgcolor="#7777FF">
<th>Key</th>
<th>Name</th>
<th colspan="2">to ResultPage</th>
</tr>
<span m:inject="s:forEach" m:items="#

{forEachDtoList}

"
m:var="e" m:varIndex="i">
<tr>
<td><span m:value="#

{e.key}

">111</span></td>
<td><span m:value="#

{e.name}

">aaa</span></td>
<td><a href="forEachResult.html" m:action="forEachResult">to ResultPage
<span m:inject="f:param" m:name="index" m:value="#

{i}"/>
</a>
</td>
<td>
<input type="button" m:action="forEachResult" value="to ResultPage"
onclick="location.href='forEachResult.html'">
<span m:inject="f:param" m:name="index" m:value="#{i}

"/>
</input>
</td>
</tr>
</span>
</table>
<input type="button" m:immediate="true" value="The exception due to action" m:action="#

{page1Action.throwException}

"/>
<input type="button" value="The exception due to initialize action" m:action="pageTran2" onclick="location.href='pageTran2.html'" m:immediate="true"/>
</form>
</span>
</body>
</html>

で、左側のボタンを押すと、NullPointerExceptionが発生する。



 Comments   
Comment by cero-t [ 2007-08-24 ]

FacesContext.getCurrentInstance()でnullが返って来る時には
initializeChildrenを行なわないようにしました。

Comment by cero-t [ 2007-08-17 ]

org.seasar.jsf.lifecycle.LifecycleImpl#execute
92行目辺り。

------------------------------------------------------------
applyRequestValues(context);
if (isFinished(context)) {
initializeChildren(context, context.getViewRoot());
return;
}
------------------------------------------------------------

1. Apply Request ValuesでisFinishedになるのは、
 「m:immediate="true"」の時。

2. その時にinitializeChildrenを行なっているのは、
 「遷移先」の画面の入力項目やForEachを初期化するため。

3. もし <a m:immediate="true" m:action="xxxAction.hoge"> でsubmitし
 hoge内で例外が発生し、ErrorPageManagerにディスパッチされた場合は、
 ここのinitializeChildrenって、全く不要か、
 それとも、「遷移後のエラー画面」をinitializeChildrenする必要アリか?

現状では、
ErrorPageManagerでディスパッチされると、FacesContextにnullがsetされる。
また、context.getViewRoot()で、「遷移元の画面」のViewRootが取れてきてしまい、
結局、「遷移元の画面を初期化する」という超無駄な処理をやっている。

⇒ここで初期化処理を行なわないよう修正する。
 つまり、FacesContext.getCurrentInstance() == nullの時はinitializeChildrenしない

Generated at Tue Dec 16 00:13:29 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.