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

  1. Set a concrete trigger case when building the proto (e.g. setAlways, setElementCount, setDefault)
  2. Regenerate the pipeline proto via supported Beam trigger translation (toProto)
  3. 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

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


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/4eaba7ece80d24b4. Report an issue: GitHub.