如何在 struts2 操作中验证来自表单的输入

How to validate input from form in struts2 action

我有一个 jsp 和一个 struts2 表单,它有一个数字类型的输入小部件,如果我清空这个小部件然后提交到表单,在 struts (之前我的验证方法)我在调试日志中得到这个:

19:10:30,734 ERROR [com.opensymphony.xwork2.interceptor.ParametersInterceptor.error:34] Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'someDto.intCol' on 'class mypackage.MyAction: Error setting expression 'someDto.intCol' with value ['', ]

我想捕获此异常("Unexpected Exception")做一些事情,然后在验证器中(在操作中)使用来自 ActionSupport class、[=13= 的 addFieldError 设置错误]

感谢您的帮助:)

编辑:

dto class:

public class SomeDto() {

    private Integer intCol; //{with getters&setters}

问题是当用户清除表单中的输入时(在jsp中),struts尝试将[''](或换句话说是空字符串)转换为与 ParametersInterceptor 的整数 class(就像在日志行中一样)。

因此,dto 具有 getter 和 setter。

如@RomanC 所述如果您查看第 299 行附近的 ParametersInterceptor,您会发现此循环:

for (Map.Entry<String, Object> entry : acceptableParameters.entrySet()) {
            String name = entry.getKey();
            Object value = entry.getValue();
            try {
                newStack.setParameter(name, value);
            } catch (RuntimeException e) {
                if (devMode) {
                    notifyDeveloperParameterException(action, name, e.getMessage());
                }
            }
        }

这是异常发生的地方,您会看到日志消息。你可以扩展 ParametersInterceptor 并做你想做的事。例如,你可以把一些参数放在ValueStack中,然后在你action.

中使用它

但我也觉得很棘手。您可能会找到另一种方法来解决您的问题,而不是直接处理这个拦截器代码。例如将 intCol 转换为 String 并使用验证器。

您可以使用 "ParameterAware" 拦截器:

@Override
public void setParameters(Map<String, String[]> parameters) {
    System.out.println("parameters: " + parameters);

    if (parameters.get("someDto.intCol")[0].length() == 0) {
        parameters.put("someDto.intCol", new String[]{"0"});
    }
}

这将从 jsp 中获取参数,如果为空,则将改为 0,

此致。