Error while using API with multipart request

Hi Team,

I’m not able to execute a process containing API with multi-part request. Getting the following error:
org.flowable.engine.common.api.FlowableException: Couldn’t serialize value ‘[org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@7e5624eb, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@acd39f9, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@38df1d91, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@448f33e5, org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@2b66281b]’ in variable 'request_files’
at org.flowable.engine.impl.variable.SerializableType.serialize(SerializableType.java:98) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.variable.SerializableType.setValue(SerializableType.java:76) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.persistence.entity.VariableInstanceEntityImpl.setValue(VariableInstanceEntityImpl.java:127) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.persistence.entity.VariableInstanceEntityManagerImpl.create(VariableInstanceEntityManagerImpl.java:57) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.createVariableInstance(VariableScopeImpl.java:862) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl.createVariableInstance(ExecutionEntityImpl.java:537) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.createVariableLocal(VariableScopeImpl.java:783) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:661) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:612) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstanceWithInitialFlowElement(ProcessInstanceHelper.java:172) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:96) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.util.ProcessInstanceHelper.createAndStartProcessInstance(ProcessInstanceHelper.java:66) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.cmd.StartProcessInstanceCmd.createAndStartProcessInstance(StartProcessInstanceCmd.java:110) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:103) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:38) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:49) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:91) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:70) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:54) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.interceptor.BpmnOverrideContextInterceptor.execute(BpmnOverrideContextInterceptor.java:25) ~[flowable-engine-6.1.2.jar:6.1.2]
at org.flowable.engine.common.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:50) ~[flowable-engine-common-6.1.2.jar:6.1.2]
at org.flowable.engine.common.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:68) ~[flowable-engine-common-6.1.2.jar:6.1.2]
at org.flowable.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47) ~[flowable-spring-6.1.2.jar:6.1.2]
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) ~[spring-tx-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.flowable.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45) ~[flowable-spring-6.1.2.jar:6.1.2]
at org.flowable.engine.common.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:29) ~[flowable-engine-common-6.1.2.jar:6.1.2]
at org.flowable.engine.common.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56) ~[flowable-engine-common-6.1.2.jar:6.1.2]
at org.flowable.engine.common.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:51) ~[flowable-engine-common-6.1.2.jar:6.1.2]
at org.flowable.engine.impl.RuntimeServiceImpl.startProcessInstanceByKey(RuntimeServiceImpl.java:98) ~[flowable-engine-6.1.2.jar:6.1.2]
at com.wipro.service.Impl.process.execute.StandardExecutionService.execute(StandardExecutionService.java:159) ~[classes/:na]
at com.wipro.service.Impl.process.execute.StandardExecutionService$$FastClassBySpringCGLIB$$efb81be7.invoke() [classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) [spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) [spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) [spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at com.wipro.aspects.LicenseAspect.aroundAdvice(LicenseAspect.java:76) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_144]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144]

How can I fix it.

Regards,
Keshav

Hi,

could you show the request / payload?

Regards,

Yvo

            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    	builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    	builder.addTextBody("json", execution.getVariable({RequestObjectName}).toString(), ContentType.TEXT_PLAIN);
    	MultiValueMap<String, Object> map = (MultiValueMap<String, Object>) execution.getVariable({FileKeyName});
    	List<Object> files = map.get("files");
    	for (Object obj : files) {
    		File file = (File) obj;
    		builder.addBinaryBody("files", file, ContentType.DEFAULT_BINARY, file.getName());
    	}
            execution.setVariable(AppConstants.EXECUTION_VARIABLE_REQUEST, builder.build().getContent());

Now I’m getting these two types of error:
org.flowable.engine.common.api.FlowableException: couldn’t find a variable type that is able to serialize java.io.ByteArrayInputStream@4e9c2532
at org.flowable.engine.impl.variable.DefaultVariableTypes.findVariableType(DefaultVariableTypes.java:62)
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.updateVariableInstance(VariableScopeImpl.java:841)
at org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl.updateVariableInstance(ExecutionEntityImpl.java:553)
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.setVariableLocal(VariableScopeImpl.java:741)
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:644)
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:654)
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:654)
at org.flowable.engine.impl.persistence.entity.VariableScopeImpl.setVariable(VariableScopeImpl.java:612)

AND–
org.apache.http.ContentTooLongException: Content length is too long: 1947201
at org.apache.http.entity.mime.MultipartFormEntity.getContent(MultipartFormEntity.java:103)
at com.wipro.controllers.delegates.PreProcessDelegate.execute(PreProcessDelegate.java:109)
at org.flowable.engine.impl.delegate.invocation.JavaDelegateInvocation.invoke(JavaDelegateInvocation.java:34)
at org.flowable.engine.impl.delegate.invocation.DelegateInvocation.proceed(DelegateInvocation.java:35)
at org.flowable.engine.impl.delegate.invocation.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:25)
at org.flowable.engine.impl.bpmn.behavior.ServiceTaskJavaDelegateActivityBehavior.execute(ServiceTaskJavaDelegateActivityBehavior.java:47)
at org.flowable.engine.impl.bpmn.helper.ClassDelegate.execute(ClassDelegate.java:199)
at org.flowable.engine.impl.agenda.ContinueProcessOperation.executeActivityBehavior(ContinueProcessOperation.java:233)
at org.flowable.engine.impl.agenda.ContinueProcessOperation.executeSynchronous(ContinueProcessOperation.java:153)
at org.flowable.engine.impl.agenda.ContinueProcessOperation.continueThroughFlowNode(ContinueProcessOperation.java:110)
at org.flowable.engine.impl.agenda.ContinueProcessOperation.continueThroughSequenceFlow(ContinueProcessOperation.java:280)
at org.flowable.engine.impl.agenda.ContinueProcessOperation.run(ContinueProcessOperation.java:76)

I tried many different combinations for this but still facing the same exceptions. Can you suggest any variable type for HttpEntity in flowable?

You’re trying to serialze a MultipartEntityBuilder as a process variable? That’s no a good idea, better to store the primitive values and build entityBuilder when needed (Content length is too long is probably related) .
What’s the use case you’re trying to solve?

Thanks for the response Joram. My usecase was to make the application capable to handle file uploads for the API(Http Tasks) to use them (as the API were of request type multipart/form-data). I was able to salvage a crude solution for my usecase.