カスタムインターセプターを作成し、後処理中に、値スタックに例外オブジェクトが存在するかどうかを確認して、actionError/actionMessage を追加したいと考えています。
public String intercept(ActionInvocation invocation) throws Exception {
result= invocation.invoke();
// postprocessing start
invocation.addPreResultListener(new PreResultListener() {
@Override
public void beforeResult(ActionInvocation invocationInner, String resultCode) {
Object obj=invocation.getInvocationContext().getValueStack().findValue("exception");
if(obj!=null)
{
if(obj instanceof Exception)
{
try{
Object action=invocation.getAction();
((ActionSupport)action).addActionError("Error");
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
return result;
結果が「エラー」の場合、error.jsp にリダイレクトしています
<s:if test="hasActionErrors()">
<s:actionerror/>
</s:if>
しかし、error.jspには何も表示されません
インターセプターからパラメーターを設定しようとしても
invocationInner.getInvocationContext().getValueStack().setValue("errorNum", "333");
また
Map<String, Object> parameters = invocationInner.getInvocationContext().getParameters();
parameters.put("errorNum", "8888");
invocationInner.getInvocationContext().getValueStack().push(parameters);
jspのようなパラメータにアクセスする
<s:property value="%{#parameters['errorNum']}"/>
しかし、jspでまだ何も得られないのは、セッションで変数を設定しているときに問題なく動作するため、オブジェクトのスコープが原因です。
後処理を実装するための私のアプローチが間違っているか、それとも欠けているか。