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的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值