{"record":{"id":"d28dd48f0ffb6a09","repo":"dbeaver/dbeaver","slug":"null-producer","errorCode":null,"errorMessage":"Null producer","messagePattern":"Null producer","errorType":"exception","errorClass":"DBException","httpStatus":null,"severity":"error","filePath":"plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/DataTransferJob.java","lineNumber":138,"sourceCode":"                elapsedTime = System.currentTimeMillis() - startTime;\n            }\n        }\n        return Status.OK_STATUS;\n    }\n\n    @Override\n    protected void canceling() {\n        transferCanceled = true;\n        super.canceling();\n    }\n\n    private void transferData(\n        @NotNull DBRProgressMonitor monitor,\n        @NotNull DataTransferPipe transferPipe\n    ) throws DBException, IOException {\n        IDataTransferProducer producer = transferPipe.getProducer();\n        if (producer == null) {\n            throw new DBException(\"Null producer\");\n        }\n        IDataTransferConsumer<?, ?> consumer = transferPipe.getConsumer();\n        if (consumer == null) {\n            throw new DBException(\"Null consumer\");\n        }\n\n        String inputName = producer.getObjectFullName(monitor);\n        String outputName = consumer.getObjectFullName(monitor);\n        monitor.beginTask(\n            NLS.bind(DTMessages.data_transfer_wizard_job_container_name,\n                CommonUtils.truncateString(inputName, 200),\n                CommonUtils.truncateString(outputName, 200)), 1);\n\n        IDataTransferSettings nodeSettings = settings.getNodeSettings(producer);\n        try {\n            //consumer.initTransfer(producer.getDatabaseObject(), consumerSettings, );\n\n            IDataTransferProcessor processor = settings.getProcessor() == null ? null : settings.getProcessor().getInstance();","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/dbeaver/dbeaver/blob/1e5ee1042bc61661368942aece126f3e67049955/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/DataTransferJob.java#L120-L156","documentation":"Thrown by DataTransferJob.transferData when transferPipe.getProducer() returns null. The pipe is expected to carry both a producer and a consumer before the job runs; a null producer means the pipe was never fully wired. This is a configuration/contract failure, not a runtime data error.","triggerScenarios":"A DataTransferPipe was constructed/registered with a null producer (e.g. new DataTransferPipe(null, consumer)) and then passed to the transfer job; or setProducer was never called and the consumer-only side of an export lost its producer (tables deleted, see DataTransferSettings recovery logic).","commonSituations":"Exporting from source containers that were deleted between wizard configuration and job execution; programmatically building pipes without assigning both ends; a deserialized saved task whose producer node class no longer exists.","solutions":["Before run(), assert each pipe has a non-null producer: pipe.getProducer() != null.","Re-open the transfer configuration and re-select source objects so producers are regenerated.","If scripting the job, always construct pipes with new DataTransferPipe(producer, consumer).","For saved tasks whose source objects vanished, recreate the task against current containers."],"exampleFix":"// before\nDataTransferPipe pipe = new DataTransferPipe(null, consumer);\nnew DataTransferJob(settings).schedule();\n\n// after\nif (pipe.getProducer() == null) {\n    throw new IllegalStateException(\"Pipe missing producer for \" + consumer);\n}\nnew DataTransferJob(settings).schedule();","handlingStrategy":"validation","validationCode":"for (DataTransferPipe pipe : settings.getDataPipes()) {\n    if (pipe.getProducer() == null) {\n        throw new DBException(\"Pipe has no producer; refusing to run transfer\");\n    }\n}","typeGuard":"static boolean isPipeComplete(DataTransferPipe p) {\n    return p != null && p.getProducer() != null;\n}","tryCatchPattern":"try {\n    job.transferData(monitor, pipe);\n} catch (DBException e) {\n    if (\"Null producer\".equals(e.getMessage())) {\n        // rebuild producer from current source containers\n    } else throw e;\n}","preventionTips":["Always construct DataTransferPipe with both producer and consumer.","After deserializing a saved task, re-resolve producers against live containers.","Validate the full pipe set before scheduling the job."],"tags":["data-transfer","producer","null-check","pipe-configuration"],"backgroundTag":null,"analyzedSha":"1e5ee1042bc61661368942aece126f3e67049955","analyzedAt":"2026-08-13T23:31:13.467Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}