apache/beam · error · IllegalArgumentException
Required field 'trigger' not set in %s
Error message
Required field 'trigger' not set in %s
What it means
TriggerTranslation.fromProto converts a RunnerApi.Trigger into its Java Trigger equivalent. If the trigger oneof is TRIGGER_NOT_SET, there is no trigger definition to convert, so an IllegalArgumentException is thrown.
Source
Thrown at sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/TriggerTranslation.java:281
}
return trigger;
case AFTER_SYNCHRONIZED_PROCESSING_TIME:
return AfterSynchronizedProcessingTime.ofFirstElement();
case ALWAYS:
return new ReshuffleTrigger();
case ELEMENT_COUNT:
return AfterPane.elementCountAtLeast(triggerProto.getElementCount().getElementCount());
case NEVER:
return Never.ever();
case OR_FINALLY:
return fromProto(triggerProto.getOrFinally().getMain())
.orFinally((OnceTrigger) fromProto(triggerProto.getOrFinally().getFinally()));
case REPEAT:
return Repeatedly.forever(fromProto(triggerProto.getRepeat().getSubtrigger()));
case DEFAULT:
return DefaultTrigger.of();
case TRIGGER_NOT_SET:
throw new IllegalArgumentException(
String.format("Required field 'trigger' not set in %s", triggerProto));
default:
throw new IllegalArgumentException(
String.format("Unknown trigger case: %s", triggerProto.getTriggerCase()));
}
}
private static List<Trigger> protosToTriggers(List<RunnerApi.Trigger> triggers) {
List<Trigger> result = Lists.newArrayList();
for (RunnerApi.Trigger trigger : triggers) {
result.add(fromProto(trigger));
}
return result;
}
// Do not instantiate
private TriggerTranslation() {}
}View on GitHub (pinned to 12126d8942)
Solutions
- Set a concrete trigger case when building the proto (e.g. setAlways, setElementCount, setDefault)
- Regenerate the pipeline proto via supported Beam trigger translation (toProto)
- Check triggerProto.getTriggerCase() != TRIGGER_NOT_SET before calling fromProto
Example fix
// before Trigger.newBuilder().build(); // after Trigger.newBuilder().setDefault(Trigger.Default.newBuilder()).build();
Defensive patterns
Strategy: type-guard
Validate before calling
if (triggerProto.getTriggerCase() == RunnerApi.Trigger.TriggerCase.TRIGGER_NOT_SET) {
throw new IllegalStateException("trigger oneof must be set");
} Type guard
boolean hasTrigger(RunnerApi.Trigger t) {
return t.getTriggerCase() != RunnerApi.Trigger.TriggerCase.TRIGGER_NOT_SET;
} Try / catch
try {
TriggerTranslation.fromProto(triggerProto);
} catch (IllegalArgumentException e) {
// handle unset trigger oneof
} Prevention
- Always set a trigger case when building Trigger protos
- Use TriggerTranslation.toProto rather than hand-building trigger protos
When it happens
Trigger: Deserializing a pipeline proto containing an empty Trigger message — a Trigger proto built without setting any of afterAll/afterEach/afterFirst/afterEndOfWindow/elementCount/never/orFinally/always/repeat/default.
Common situations: Building Trigger protos programmatically without calling a setter; unset oneof fields dropped by partial proto construction; corrupted pipeline files.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- Required field 'timestamp_transform' not set in %s
- Unable to parse schema for RowCoder:
- Missing serialized typeDescriptor
- Failed to convert PipelineOptions to JSON
- Internal error determining boundedness of Read
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/4eaba7ece80d24b4.
Report an issue: GitHub.