次のアクション クラスでは、パラメーター インターセプターを使用しています。
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
@InterceptorRefs(@InterceptorRef(value="store", params={"operationMode", "AUTOMATIC"}))
public final class TestAction extends ActionSupport implements Serializable, ValidationAware, Preparable
{
private static final long serialVersionUID = 1L;
private String param1;
private String param2;
//Getters and setters.
public TestAction() {}
@Action(value = "TestMessage",
results = {
@Result(name=ActionSupport.SUCCESS, type="redirectAction", params={"namespace", "/admin_side", "actionName", "Test"}),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs={
@InterceptorRef(value="paramsPrepareParamsStack", params={"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true"})
})
public String insert() {
// Do something. Add or update a row to the database (one at a time).
addActionMessage("Action message");
addActionError("Error message");
return ActionSupport.SUCCESS;
}
@Action(value = "Test",
results = {
@Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs = {
@InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "param1, param2", "params.excludeParams", "extraParam", "validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})})
public String load() throws Exception {
// This method is just required to return an initial view on page load.
return ActionSupport.SUCCESS;
}
@Override
public void prepare() throws Exception {}
}
以下は次のとおりです<s:form>
。
<s:form namespace="/admin_side" action="Test" validate="true" id="dataForm" name="dataForm">
<s:if test="hasActionMessages()">
<s:actionmessage theme="jquery"/>
</s:if>
<s:if test="hasActionErrors()">
<s:actionerror theme="jquery"/>
</s:if>
<s:hidden name="param1"/>
<s:hidden name="param2"/>
<s:hidden name="extraParam"/>
<s:submit value="Submit" action="TestMessage"/>
</s:form>
ここでは、非表示のフォーム フィールドextraParam
が宣言されていないため、アクション クラスにセッターとゲッターがありません。
この場合、このフォームが送信されると、サーバー端末に次のメッセージが表示されます。
SEVERE: 開発者通知 (struts.devMode を false に設定してこのメッセージを無効にします): 'class actions.TestAction で 'extraParam' を設定中に予期しない例外がキャッチされました: 値 ['', ] で式 'extraParam' を設定中にエラーが発生しました
params.excludeParams
extraParam
アクションクラスのようにパラメーターを除外しません。
パラメータインターセプターを使用しているときに、このような例外をどうにかして防ぐことはできますか? このようなメッセージは、アクション メッセージに不必要に追加され<s:actionmessage/>
、使用されている場合は、まったく表示されないはずのときに を介して表示されます。
これparamsPrepareParamsStack
をアクション クラス then に置き換えるとdefaultStack
、そのようなメッセージは表示されません。次のように警告を出すだけです。
警告: パラメータ [extraParam] はパターンの excludeParams リストにあります!
そのようなメッセージを無効にするように設定してください。struts.devMode
false