如何在struts2动作中验证表单中的输入

时间:2016-05-24 22:18:51

标签: java validation jsp struts2

我有一个带有struts2表单的jsp,它有一个类型为number的输入小部件,如果我清空这个小部件然后提交到表单,在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类中的addFieldError设置错误,

感谢您的帮助:)

修改

dto课程:

public class SomeDto() {

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

问题是,当用户清除Form中的输入(在jsp中)时,struts尝试将[''](或其他词中的String)转换为带有ParametersInterceptor类的Integer(就像在日志中一样)排队)。

所以,dto有吸气剂和制定者。

2 个答案:

答案 0 :(得分:1)

您可以使用“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,

问候。

答案 1 :(得分:0)

正如@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并使用验证器。