apache/seatunnel · error · IllegalArgumentException

event must not be empty

Error message

event must not be empty

What it means

JsonOutputFormatter.format() requires a non-empty list of LineElement because it reads the first and last elements to build the CollectedRecord's boundaries. An empty event cannot produce a meaningful record, so it is rejected with IllegalArgumentException.

Solutions

  1. Guard the caller: skip format() when event == null || event.isEmpty()
  2. Fix the MultilineAssembler flush path so it never emits empty events
  3. Catch IllegalArgumentException around format() and log/skip if you cannot control the input

Example fix

// before
formatter.format(event, sourceId);
// after
if (event != null && !event.isEmpty()) {
    formatter.format(event, sourceId);
}
Defensive patterns

Strategy: type-guard

Validate before calling

if (event == null || event.isEmpty()) { return; }

Type guard

boolean hasEvent(List<MultilineAssembler.LineElement> e) { return e != null && !e.isEmpty(); }

Try / catch

try { formatter.format(event, sourceId); } catch (IllegalArgumentException e) { LOG.warn("Skipping empty event", e); }

Prevention

When it happens

Trigger: Calling format(Collections.emptyList(), sourceId) — typically when a MultilineAssembler flushes an empty buffer (e.g. forced flush before any line was appended).

Common situations: A flush triggered on an empty buffer during shutdown or file rotation; a bug in assembler event emission; passing an unfiltered list that had all lines removed upstream.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/432df2e2e6435183. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-edge-agent/seatunnel-edge-agent-connector/src/main/java/org/apache/seatunnel/edge/agent/connector/file/output/JsonOutputFormatter.java:38

import org.apache.seatunnel.shade.com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.seatunnel.shade.com.fasterxml.jackson.databind.JsonNode;
import org.apache.seatunnel.shade.com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.seatunnel.shade.com.fasterxml.jackson.databind.node.ArrayNode;
import org.apache.seatunnel.shade.com.fasterxml.jackson.databind.node.ObjectNode;

import org.apache.seatunnel.edge.agent.connector.file.multiline.MultilineAssembler;
import org.apache.seatunnel.edge.agent.connector.record.CollectedRecord;

import java.util.List;

public class JsonOutputFormatter implements OutputFormatter {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public CollectedRecord format(List<MultilineAssembler.LineElement> event, String sourceId) {
        if (event.isEmpty()) {
            throw new IllegalArgumentException("event must not be empty");
        }
        MultilineAssembler.LineElement first = event.get(0);
        MultilineAssembler.LineElement last = event.get(event.size() - 1);
        try {
            String json;
            if (event.size() == 1) {
                ObjectNode node = buildLineObjectWithParsedPayload(0, first, first.getText());
                json = objectMapper.writeValueAsString(node);
            } else {
                ArrayNode array = objectMapper.createArrayNode();
                for (int i = 0; i < event.size(); i++) {
                    MultilineAssembler.LineElement e = event.get(i);
                    array.add(buildLineObjectWithParsedPayload(i, e, e.getText()));
                }
                json = objectMapper.writeValueAsString(array);
            }
            return new CollectedRecord(
                    json,

View on GitHub (pinned to cf67b549a7)