Проблема с типом пользовательской переменной Activiti

В Activiti все сложные объекты сериализуются и хранятся в базе данных с использованием сериализации Java. Я хочу переопределить это поведение для своих пользовательских типов и сохранить объекты как JSON. Это поможет мне лучше контролировать сохраняемый объект.

Для этого я создал свой собственный VariableType. Ниже приведен фрагмент

public class CustomVariableType extends ByteArrayType{
// overrided all the needed method.
}

Эти типы настраиваются в конфигурации действий, как показано ниже:

public class WorklistConfigurationService {

    private ProcessEngineConfigurationImpl processEngineConfigurationImpl;
    private List<CustomVariableType> customVarsTypes;
    public void init(){
        logger.debug("inside init");
        for(VOVariableType varType : voVars){
            logger.debug("adding type {}", varType.getTypeName());
            processEngineConfigurationImpl.getVariableTypes().addType(varType, 0);
        }
    }
   // getter and setters...
}

Ниже показано, как я ввожу значения выше в Spring.

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="worklistConfigurationService"
        class="...WorklistConfigurationService" init-method="init">
        <property name="customVarTypes">
            <list>
                <bean id="var1" class="...CustomVariableType">
                    <constructor-arg type="java.lang.String" value="custom" />
                    <constructor-arg type="java.lang.Class"
                        value="..CustomType" />
                </bean>
            </list>
        </property>
        <property name="processEngineConfigurationImpl" ref="processEngineConfiguration" />
    </bean>

Но новый механизм сериализации никогда не используется движком activiti. Вместо этого всегда используется сериализация по умолчанию. Может кто-нибудь помочь в решении этого.


person ajjain    schedule 20.11.2013    source источник
comment
Вы также переопределили метод isAbleToStore в CustomVariableType? А что такое воВар?   -  person matts    schedule 20.11.2013
comment
@matts Я просто пытался скрыть свои имена бизнес-класса. переименованы voVars в пользовательские типы. Да, я переопределил метод isAbleToStore.   -  person ajjain    schedule 21.11.2013
comment
Не знаю как, но тот же кусок кода сработал. Мой плохой, может кто-нибудь закрыть эту тему. Кстати, я планирую поделиться этим на GIST, чтобы на это можно было ссылаться. Это одна из наименее документированных, но очень полезных функций. Обновлю здесь, как только закончу работу с GIST. Модератор, пожалуйста, дайте мне знать, если обмен ссылками на код не разрешен.   -  person ajjain    schedule 22.11.2013


Ответы (1)


Наконец-то я понял основную причину проблемы. В классе DeserializedObject ниже приведен код

public class DeserializedObject {

  Object deserializedObject;
  byte[] originalBytes;
  VariableInstanceEntity variableInstanceEntity;

  public DeserializedObject(Object deserializedObject, byte[] serializedBytes, VariableInstanceEntity variableInstanceEntity) {
    this.deserializedObject = deserializedObject;
    this.originalBytes = serializedBytes;
    this.variableInstanceEntity = variableInstanceEntity;
  }

  public void flush() {
    // this first check verifies if the variable value was not overwritten with another object
    if (deserializedObject==variableInstanceEntity.getCachedValue() && !variableInstanceEntity.isDeleted()) {
      byte[] bytes = VOVariableType.serialize(deserializedObject, variableInstanceEntity);
      if (!Arrays.equals(originalBytes, bytes)) {
        variableInstanceEntity.setBytes(bytes);
      }
    }
  }
} 

Эта строка является причиной проблемы:

byte[] bytes = SerializableType.serialize(deserializedObject, variableInstanceEntity);

Код всегда использует SerializableType для сериализации объекта. И сериализация по умолчанию использует сериализацию по умолчанию. А там по проблеме...

Не знаю теперь, как двигаться дальше.

person ajjain    schedule 27.11.2013
comment
Я также участвую в обсуждении на этом форуме @ activiti. Пожалуйста, следите за обсуждением здесь forums.activiti.org/content/ - person ajjain; 29.11.2013