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
- Guard the caller: skip format() when event == null || event.isEmpty()
- Fix the MultilineAssembler flush path so it never emits empty events
- 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
- Check buffer size before flushing assemblers
- Skip formatter calls for empty lists at the pipeline layer
- Add asserts/tests that flush() never emits empty events
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
- event must not be empty
- ACKNOWLEDGE_FAILED
- Already an MDCCallable
- Already an MDCComparator
- Already an MDCConsumer
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)