{"record":{"id":"5f4a09cb9b30ff52","repo":"flowable/flowable-engine","slug":"deadletterjobid-is-null","errorCode":null,"errorMessage":"deadletterJobId is null","messagePattern":"deadletterJobId is null","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/cmd/MoveDeadLetterJobToHistoryJobCmd.java","lineNumber":50,"sourceCode":"    private static final long serialVersionUID = 1L;\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(MoveDeadLetterJobToHistoryJobCmd.class);\n\n    protected String deadletterJobId;\n    protected int retries;\n    protected JobServiceConfiguration jobServiceConfiguration;\n\n    public MoveDeadLetterJobToHistoryJobCmd(String deadletterJobId, int retries, JobServiceConfiguration jobServiceConfiguration) {\n        this.deadletterJobId = deadletterJobId;\n        this.retries = retries;\n        this.jobServiceConfiguration = jobServiceConfiguration;\n    }\n\n    @Override\n    public HistoryJob execute(CommandContext commandContext) {\n\n        if (deadletterJobId == null) {\n            throw new FlowableIllegalArgumentException(\"deadletterJobId is null\");\n        }\n\n        DeadLetterJobEntity deadLetterJobEntity = jobServiceConfiguration.getDeadLetterJobEntityManager().findById(deadletterJobId);\n        if (deadLetterJobEntity == null) {\n            throw new JobNotFoundException(deadletterJobId);\n        }\n\n        if (LOGGER.isDebugEnabled()) {\n            LOGGER.debug(\"Moving deadletter job to history job table {}\", deadLetterJobEntity.getId());\n        }\n\n        return jobServiceConfiguration.getJobManager().moveDeadLetterJobToHistoryJob(deadLetterJobEntity, retries);\n    }\n\n    public String getDeadletterJobId() {\n        return deadletterJobId;\n    }\n","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/cmd/MoveDeadLetterJobToHistoryJobCmd.java#L32-L68","documentation":"MoveDeadLetterJobToHistoryJobCmd.execute() validates deadletterJobId and throws FlowableIllegalArgumentException when it is null. The command moves a dead-letter job to the history job table, which requires the id of the dead-letter job to move.","triggerScenarios":"Calling ManagementService.moveDeadLetterJobToHistoryJob(deadLetterJobId) with a null id, or constructing/executing the command directly without the id.","commonSituations":"Iterating dead-letter jobs where a prior operation already moved/deleted the job and the stale reference is null; API wrappers forwarding null from optional parameters; copy-paste mistakes where the wrong variable is passed.","solutions":["Null-check the dead-letter job id before calling moveDeadLetterJobToHistoryJob.","Re-query the dead-letter job list before each move in loops, since successful moves invalidate stale ids.","Correct the caller/wrapper that forwards null instead of failing earlier."],"exampleFix":"// before\nfor (Job job : jobs) {\n    managementService.moveDeadLetterJobToHistoryJob(job.getId());\n}\n// after\nfor (Job job : jobs) {\n    if (job != null && job.getId() != null) {\n        managementService.moveDeadLetterJobToHistoryJob(job.getId());\n    }\n}","handlingStrategy":"validation","validationCode":"if (deadLetterJobId == null || deadLetterJobId.isEmpty()) throw new IllegalArgumentException(\"deadLetterJobId required\");","typeGuard":"boolean canMove = deadLetterJob != null && deadLetterJob.getId() != null;","tryCatchPattern":"try { managementService.moveDeadLetterJobToHistoryJob(id); } catch (FlowableIllegalArgumentException e) { log.warn(\"Skipped move: {}\", e.getMessage()); }","preventionTips":["Re-query dead-letter jobs between moves; stale ids may be null/gone","Never pass through optional parameters unchecked","Log and skip invalid entries in batch jobs"],"tags":["flowable","null-argument","deadletter-job","illegal-argument"],"backgroundTag":"null-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}