camunda / camunda-bpm-platform

Flexible framework for workflow and decision automation with BPMN and DMN. Integration with Quarkus, Spring, Spring Boot, CDI.
https://camunda.com/
Apache License 2.0
4.11k stars 1.55k forks source link

Migration: NullPointerException when trying to execute a Migration Plan via REST API #4071

Closed patrickegli closed 8 months ago

patrickegli commented 8 months ago

Environment

Description

We are trying to migrate running process instances using the REST API. Calling the endpoint results in a NullPointerException. To rule out any specifica from our model, I reproduced the problem with a very simple process.

Version 1: camunda-migration-test-v1

Version 2: camunda-migration-test-v2 Note: The only change is the name of the receive task.

Calling the migration endpoint results in a NPE:

2024-02-05 09:08:27.239  WARN 9 --- [nio-8080-exec-7] org.camunda.bpm.engine.rest.exception    : ENGINE-REST-HTTP500 java.lang.NullPointerException
        at org.camunda.bpm.engine.rest.dto.migration.MigrationPlanDto.toMigrationPlan(MigrationPlanDto.java:97)
        at org.camunda.bpm.engine.rest.impl.MigrationRestServiceImpl.createMigrationPlan(MigrationRestServiceImpl.java:126)
        at org.camunda.bpm.engine.rest.impl.MigrationRestServiceImpl.createMigrationPlanExecutionBuilder(MigrationRestServiceImpl.java:101)
        at org.camunda.bpm.engine.rest.impl.MigrationRestServiceImpl.executeMigrationPlan(MigrationRestServiceImpl.java:92)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:124)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:167)
        at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:159)
        at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:475)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:397)
        at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
        at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:255)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
        at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234)
        at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:684)
        at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
        at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319)
        at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.camunda.bpm.engine.rest.filter.CacheControlFilter.doFilter(CacheControlFilter.java:45)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.camunda.bpm.engine.rest.filter.AbstractEmptyBodyFilter.doFilter(AbstractEmptyBodyFilter.java:56)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.camunda.bpm.engine.rest.security.auth.ProcessEngineAuthenticationFilter.doFilter(ProcessEngineAuthenticationFilter.java:155)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:356)
        at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:175)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:769)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:829)

Steps to reproduce

  1. Create migration plan; POST /migration/generate
    {
    "sourceProcessDefinitionId": "MigrationTest:1:6931dcae-c405-11ee-bb6e-f62b15d76eff",
    "targetProcessDefinitionId": "MigrationTest:2:d0c44c0b-c405-11ee-bb6e-f62b15d76eff",
    "updateEventTriggers": false
    }
  2. Execute migration plan: POST /migration/execute
    {
    "sourceProcessDefinitionId": "MigrationTest:1:6931dcae-c405-11ee-bb6e-f62b15d76eff",
    "targetProcessDefinitionId": "MigrationTest:2:d0c44c0b-c405-11ee-bb6e-f62b15d76eff",
    "instructions": [
    {
      "sourceActivityIds": [
        "Activity_1"
      ],
      "targetActivityIds": [
        "Activity_1"
      ],
      "updateEventTrigger": false
    }
    ],
    "variables": null
    }

Observed Behavior

Server Error HTTP 500 (with the provided Exception in the log)

Expected behavior

Migration running successfully

Root Cause (Required on prioritization)

Solution Ideas

Hints

Links

Breakdown

### Pull Requests

Dev2QA handover

tasso94 commented 8 months ago

Hi @patrickegli,

Your payload for the POST /migration/execute request doesn't match the expected payload.

It should look similar to this one:

{
    "migrationPlan": {
        "sourceProcessDefinitionId": "MigrationTest:1:6931dcae-c405-11ee-bb6e-f62b15d76eff",
        "targetProcessDefinitionId": "MigrationTest:2:d0c44c0b-c405-11ee-bb6e-f62b15d76eff",
        "instructions": [
            {
                "sourceActivityIds": [
                    "Activity_1"
                ],
                "targetActivityIds": [
                    "Activity_1"
                ],
                "updateEventTrigger": false
            }
        ],
        "variables": null
    },
    "processInstanceIds": [],
    "processInstanceQuery": {
        "processDefinitionId": "MigrationTest:1:6931dcae-c405-11ee-bb6e-f62b15d76eff"
    },
    "skipCustomListeners": true,
    "skipIoMappings": true
}

Please have a look at our documentation: https://docs.camunda.org/rest/camunda-bpm-platform/7.21/#tag/Migration/operation/executeMigrationPlan

Best, Tassilo