В следующем классе действий я использую перехватчик параметров.
@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
не объявлено и, следовательно, не имеет сеттера и геттера в классе действий.
В этом случае при отправке этой формы на серверном терминале появляется следующее сообщение.
СЕРЬЕЗНЫЙ: уведомление разработчика (установите для struts.devMode значение false, чтобы отключить это сообщение): обнаружена непредвиденная ошибка при настройке «extraParam» для «действий класса». TestAction: ошибка установки выражения «extraParam» со значением ['', ]
params.excludeParams
не исключает параметр extraParam
, как в классе действий.
Можем ли мы как-то предотвратить такие исключения при использовании перехватчика параметров. Такие сообщения без необходимости добавляются к сообщениям о действиях и отображаются через <s:actionmessage/>
, если они используются, когда они вообще не должны отображаться.
Если это paramsPrepareParamsStack
заменить на defaultStack
в классе действий, то такие сообщения не появляются. Он просто выдает предупреждение следующим образом.
ВНИМАНИЕ: Параметр [extraParam] находится в списке шаблонов excludeParams!
Пожалуйста, не говорите просто установите struts.devMode
на false
, чтобы отключить такие сообщения.