问题
如果Action类没实现ValidationAware接口,struts在遇到类型转换失败错误时会继续调用方法,就好像什么事都没发生一样。
解决
这显然是不可取的。如果实现了这个接口,失败时struts会检查对应的action元素的配置是否包含一个name=input的result,如果有struts将把控制器交给这个result元素,如果没有struts将抛出一个异常。
结果
抛异常
//ActionSupport类实现了ValidationAware接口,出现类型转换失败就有错误提示
public class ConversionAction extends ActionSupport {
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String execute(){
System.out.println(number);
return "success";
}
}
ConversionAction继承了ActionSupport类,因为它实现了ValidationAware接口,然后测试类型转换失败,不加那个result,爆出异常
Unexpected Exception caught setting 'number' on 'class com.example.action.ConversionAction: Error setting expression 'number' with value ['we', ] MDC{}
。
错误提示
在action中配置result
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="except">/exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="except"></exception-mapping>
</global-exception-mappings>
<action name="testConversion" class="com.example.action.ConversionAction">
<result>/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
只有错误提示
同时在值栈中也有一个fieldErrors的属性
自定义类型转换器
struts不能自动完成字符串到引用类型的转换,比如日期。
开发类型转换器的类,扩展StrutsTypeConverter类
配置类型转换器
基于字段配置
在字段所在的Model的包下,新建一个ModelClassName-conversion.properties
文件,里面写上:fieldName=类型转换器的全类名
基于类型配置
在src下新建xwork-conversion.properties
,里面输入带转换类=类型转换器的全类名
验证
用生日验证,struts能自动把日期的字符串类型转换为Date类型。
我估计是struts后面更新的时候加了这个功能,所以我的<version>2.5.17</version>
版本能自动转换。