Activiti内置动态表单的date格式问题

使用Activiti和二次开发的过程中,使用modeler在线流程设计器是不可避免的(除非你手写xml或者使用Eclipse插件)。在modeler中设计表单时,有一个无法规避的问题,就是使用自定义表单的date类型,但是modeler目前(5.14)并没有给出默认的datePattern的设置,这自然就带来了时间的格式化问题。该问题会在提交有date类型的表单时引发,除非你的时间格式符合dd/MM/yyyy,否则出错时在所难免的。

解决方式:
1、从根源上解决:使用Eclipse插件编辑流程或直接书写xml,但此方法仅适用于开发者的设计,不利于用户的使用,故不推荐;
2、进行欺骗Activiti的配置:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
	...
	<!-- 处理date类型的默认正则表达式 -->
	<property name="customFormTypes">
		<list>
			<bean class="org.activiti.engine.impl.form.DateFormType">
				<constructor-arg value="yyyy-MM-dd" />
			</bean>
		</list>
	</property>
	...
</bean>


问题原因:
通过分析其源码,我们可以知道Activiti内置的4种基本类型的实现类如下:
org.activiti.engine.impl.form.StringFormType;
org.activiti.engine.impl.form.LongFormType;
org.activiti.engine.impl.form.DateFormType;
org.activiti.engine.impl.form.BooleanFormType;
其中,DateFormType的默认构造方法是有一个datePattern参数的,其构造方法如下(org.activiti.engine.impl.form.DateFormType):
public DateFormType(String datePattern) {
	this.datePattern = datePattern;
	this.dateFormat = new SimpleDateFormat(datePattern);
}

而在Activiti的配置载入这4种类型时,这个datePattern则是以西方的习惯方式初始化的(org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl):
protected void initFormTypes() {
	if (formTypes==null) {
		formTypes = new FormTypes();
		formTypes.addFormType(new StringFormType());
		formTypes.addFormType(new LongFormType());
		formTypes.addFormType(new DateFormType("dd/MM/yyyy"));
		formTypes.addFormType(new BooleanFormType());
	}
	if (customFormTypes!=null) {
		for (AbstractFormType customFormType: customFormTypes) {
			formTypes.addFormType(customFormType);
		}
	}
}

我们可以清楚的看到,当DateFormType在默认配置中,是以dd/MM/yyyy作为datePattern进行初始化的,这就是问题产生的原因。

原理分析:
方式1的原理显而易见,即相当于在activiti:formProperty的xml标签内加入datePattern="yyyy-MM-dd"的属性,限制该表单类型的默认datePattern。
我们主要解释方式2的原理,在原因分析中可以看到,4种类型在初始化时默认会加入到一个formTypes的对象中(org.activiti.engine.impl.form.FormTypes),查看该类的源码,就可以很容易的发现,FormTypes其实就是一个Map而已,而key就是表单类型的名称(如string、date等)。在初始化4种默认类型后,还会载入自定义表单类型(如果有的话),这些也就是我们之所以能进行欺骗Activiti的原因。
再看那段用于欺骗的配置,有基础的应该已经能看明白了,以yyyy-MM-dd为构造方法参数,构造新的DateFormType,利用Activiti初始化的机制,放入FormTypes中,由于FormTypes是用Map实现,新的DateFormType自然会覆盖掉旧的DateFormType(key是一样的),这样在使用时,就轻松的避免掉了datePattern的问题。

你可能感兴趣的:(Activiti)