如何在 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,
此致。
我有一个 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,
此致。