webwork中,当从前台传递一个数值,对应action中的数据类型为int时。如果传递的值超过int的最大值,比如,传递了一个333333333333,那么,在action中获取到的值,变成了:
-1674115755。
原因是:webwork的类型拦截器,对数值进行了转换。
如果想让后台提示错误,那么需要自定义个TypeConverter,当数组越界时,抛出异常,即对应到webwork中的conversionErrors。
我定义了个针对int类型做特殊处理的拦截器:
1 public class IntTypeConverter extends WebWorkTypeConverter {
2
3 @Override
4 public Object convertValue(Map context, Object o, Class toClass) {
5 if (toClass.equals(java.lang.String.class))
6 return convertToString(context, o);
7
8 if (o instanceof String[]) {
9 if (toClass.equals(java.lang.Integer.class)) {
10 String[] arrays = (String[]) o;
11 int value = Integer.valueOf(arrays[0]);//对数字进行检测,查看是否越界,如果越界,将自动抛java.lang.NumberFormatException
12 }
13 return convertFromString(context, (String[]) o, toClass);
14 }
15 if (o instanceof String) {
16 if (toClass.equals(java.lang.Integer.class)) {
17 String[] arrays = (String[]) o;
18 int value = Integer.valueOf(arrays[0]);//对数字进行检测,查看是否越界,如果越界,将自动抛java.lang.NumberFormatException
19 }
20 return convertFromString(context, new String[]{
21 (String) o
22 }, toClass);
23 }
24 else
25 return super.convertValue(context, o, toClass);
26 }
27
28 public Object convertFromString(Map map, String as[], Class class1) {
29 return Integer.valueOf(as[0]);
30 };
31
32 public String convertToString(Map map, Object obj) {
33 String result = null;
34 if (obj instanceof Integer) {
35 result = String.valueOf(obj);
36 }
37 return result;
38 };
39
40 }
要让这个类来代替webwork默认的转换你还需要在classpath目录, 一般就是classes目录放置配置文件
xwork-conversion.properties:
java.lang.Integer=IntTypeConverter 这种方法是对整个application起作用,.
如果要只对单个action起作用, 在action同一个package写一个ActionClassName-conversion.properties:
fieldName=IntTypeConverter