{"record":{"id":"0fee712ab55a28c3","repo":"apache/seatunnel","slug":"event-payload-must-not-be-null","errorCode":null,"errorMessage":"event payload must not be null","messagePattern":"event payload must not be null","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-edge-agent/seatunnel-edge-agent-starter/src/main/java/org/apache/seatunnel/edge/agent/starter/wal/sqlite/SqliteWalStore.java","lineNumber":72,"sourceCode":"        this.sourcePositionStore = new SqliteSourcePositionStore(connection, false);\n    }\n\n    public SqliteWalStore(Connection connection, boolean closeConnection) {\n        this.connection = Objects.requireNonNull(connection, \"connection\");\n        this.closeConnection = closeConnection;\n        this.sourcePositionStore = new SqliteSourcePositionStore(connection, false);\n    }\n\n    @Override\n    public EdgeSourcePositionStore sourcePositionStore() {\n        return sourcePositionStore;\n    }\n\n    @Override\n    public long append(EdgeEvent event) throws Exception {\n        byte[] payload = event.getPayload();\n        if (payload == null) {\n            throw new IllegalArgumentException(\"event payload must not be null\");\n        }\n        long now = System.currentTimeMillis();\n        boolean autoCommit = connection.getAutoCommit();\n        connection.setAutoCommit(false);\n        try {\n            long batchId = SqliteBatchIdAllocator.allocateNext(connection);\n            try (PreparedStatement statement =\n                    connection.prepareStatement(\n                            WalSqlStatements.INSERT, Statement.RETURN_GENERATED_KEYS)) {\n                statement.setString(1, event.getSourceId());\n                statement.setBytes(2, payload);\n                statement.setLong(3, event.getEventTime());\n                statement.setBytes(4, MetadataSerde.serialize(event.getMetadata()));\n                statement.setString(5, WalRecordStatus.PENDING.name());\n                statement.setInt(6, 0);\n                statement.setLong(7, now);\n                statement.setLong(8, now);\n                statement.setLong(9, batchId);","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-edge-agent/seatunnel-edge-agent-starter/src/main/java/org/apache/seatunnel/edge/agent/starter/wal/sqlite/SqliteWalStore.java#L54-L90","documentation":"SqliteWalStore.append() requires each EdgeEvent to carry a non-null payload byte array, since the payload is what is persisted into the WAL table. A null payload cannot be meaningfully appended and would break replay, so append() throws this IllegalArgumentException before starting the transaction.","triggerScenarios":"Calling walStore.append(event) with an EdgeEvent whose getPayload() returns null — e.g. an event constructed without payload bytes, or an upstream serializer that produced null for an empty message.","commonSituations":"Producers forwarding deserialized messages where empty bodies became null; building EdgeEvent objects by hand and forgetting setPayload; a codec that returns null instead of byte[0] for empty content.","solutions":["Ensure the payload is set — pass an empty byte[0] instead of null for empty events before calling append().","Fix the upstream serializer/codec so it emits empty arrays rather than null payloads.","Validate event.getPayload() != null at the producer boundary before appending.","Check where the EdgeEvent was constructed; a missing payload usually indicates a skipped assignment."],"exampleFix":"// before\nbyte[] payload = decode(body); // may return null\nstore.append(new EdgeEvent(type, payload));\n// after\nbyte[] payload = decode(body);\nstore.append(new EdgeEvent(type, payload == null ? new byte[0] : payload));","handlingStrategy":"type-guard","validationCode":"if (event.getPayload() == null) { event = event.withPayload(new byte[0]); }","typeGuard":"boolean hasPayload(EdgeEvent e) { return e.getPayload() != null; }","tryCatchPattern":"try { store.append(event); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"payload must not be null\")) { store.append(event.withPayload(new byte[0])); } else { throw e; } }","preventionTips":["Coerce empty messages to byte[0] at the serializer boundary.","Never construct EdgeEvent without explicitly setting payload.","Add producer-side assertions for payload != null in tests.","Review codecs that may return null for empty input."],"tags":["validation","wal","null-payload","event"],"backgroundTag":"null-argument","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}