我有一个带有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有吸气剂和制定者。
答案 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
并使用验证器。