{"record":{"id":"4eaba7ece80d24b4","repo":"apache/beam","slug":"required-field-trigger-not-set-in-s","errorCode":null,"errorMessage":"Required field 'trigger' not set in %s","messagePattern":"Required field 'trigger' not set in (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/TriggerTranslation.java","lineNumber":281,"sourceCode":"        }\n        return trigger;\n      case AFTER_SYNCHRONIZED_PROCESSING_TIME:\n        return AfterSynchronizedProcessingTime.ofFirstElement();\n      case ALWAYS:\n        return new ReshuffleTrigger();\n      case ELEMENT_COUNT:\n        return AfterPane.elementCountAtLeast(triggerProto.getElementCount().getElementCount());\n      case NEVER:\n        return Never.ever();\n      case OR_FINALLY:\n        return fromProto(triggerProto.getOrFinally().getMain())\n            .orFinally((OnceTrigger) fromProto(triggerProto.getOrFinally().getFinally()));\n      case REPEAT:\n        return Repeatedly.forever(fromProto(triggerProto.getRepeat().getSubtrigger()));\n      case DEFAULT:\n        return DefaultTrigger.of();\n      case TRIGGER_NOT_SET:\n        throw new IllegalArgumentException(\n            String.format(\"Required field 'trigger' not set in %s\", triggerProto));\n      default:\n        throw new IllegalArgumentException(\n            String.format(\"Unknown trigger case: %s\", triggerProto.getTriggerCase()));\n    }\n  }\n\n  private static List<Trigger> protosToTriggers(List<RunnerApi.Trigger> triggers) {\n    List<Trigger> result = Lists.newArrayList();\n    for (RunnerApi.Trigger trigger : triggers) {\n      result.add(fromProto(trigger));\n    }\n    return result;\n  }\n\n  // Do not instantiate\n  private TriggerTranslation() {}\n}","sourceCodeStart":263,"sourceCodeEnd":299,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/TriggerTranslation.java#L263-L299","documentation":"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.","triggerScenarios":"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.","commonSituations":"Building Trigger protos programmatically without calling a setter; unset oneof fields dropped by partial proto construction; corrupted pipeline files.","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"],"exampleFix":"// before\nTrigger.newBuilder().build();\n// after\nTrigger.newBuilder().setDefault(Trigger.Default.newBuilder()).build();","handlingStrategy":"type-guard","validationCode":"if (triggerProto.getTriggerCase() == RunnerApi.Trigger.TriggerCase.TRIGGER_NOT_SET) {\n  throw new IllegalStateException(\"trigger oneof must be set\");\n}","typeGuard":"boolean hasTrigger(RunnerApi.Trigger t) {\n  return t.getTriggerCase() != RunnerApi.Trigger.TriggerCase.TRIGGER_NOT_SET;\n}","tryCatchPattern":"try {\n  TriggerTranslation.fromProto(triggerProto);\n} catch (IllegalArgumentException e) {\n  // handle unset trigger oneof\n}","preventionTips":["Always set a trigger case when building Trigger protos","Use TriggerTranslation.toProto rather than hand-building trigger protos"],"tags":["java","beam","triggers","protobuf"],"backgroundTag":"missing-required-argument","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}