说明:这些内容来自于T4的官方文档和自己的理解,如果有不对的地方请批评指正
For组件和Foreach组件一样是循环组件,从T4开始Foreach组件不再 建议使用了。当我们在Form组件中使用For组件的时候,For组件会在Form组件第一次解析的时候,将其source参数所绑定的数据集合以某种规则而转化为一个字符串,放在Form表单的一个hidden的域中,当Form组件发生二次解析的时候,For组件根据隐藏在Form表单hidden域中字符串找回source参数所绑定的数据集合,从而避免Form组件在第一次解析和第二次解析的时候,由于source参数所绑定的数据集合不一致而造成的StaleLink异常。
如果source参数的数据是一个基本数据类型或者数据能被序列化T4将能自动的把对象转化成一个字符串,如果不能被序列化将报一个带有“Could not find a strategy instance for class”的ApplicationRuntimeException。
解决方法如下:
1、只存储数据对象的主键
可以定义一个包含主键的属性给keyExpression参数
2、让存储数据的类可以序列化
T4将自动的转换序列化的数据成字符串然后存储在form中
3、按照自己的方式定义类到字符串的转换方式。需要自己实现SqueezeAdaptor方法,然后在WEB-INF/hivemodule.xml中注册你的squeeze adaptor
4、使用For组件的volatile 参数,这个参数默认值为false,如果为true则表示在For组件第一次解析的时候不需要
将source参数所绑定的数据转化成字符串并隐藏在hidden域中。
官方建议的使用1、2这两种解决办法。