{"record":{"id":"ef5a971fb1a64b44","repo":"apache/beam","slug":"element-unsupported-in-context","errorCode":null,"errorMessage":"Element unsupported in ${context}","messagePattern":"Element unsupported in (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnInvoker.java","lineNumber":312,"sourceCode":"     */\n    String timerId(DoFn<InputT, OutputT> doFn);\n  }\n\n  /**\n   * This {@link ArgumentProvider} throws {@link UnsupportedOperationException} for all parameters.\n   */\n  @Internal\n  abstract class BaseArgumentProvider<InputT, OutputT>\n      implements ArgumentProvider<InputT, OutputT> {\n    @Override\n    public DoFn<InputT, OutputT>.ProcessContext processContext(DoFn<InputT, OutputT> doFn) {\n      throw new UnsupportedOperationException(\n          String.format(\"ProcessContext unsupported in %s\", getErrorContext()));\n    }\n\n    @Override\n    public InputT element(DoFn<InputT, OutputT> doFn) {\n      throw new UnsupportedOperationException(\n          String.format(\"Element unsupported in %s\", getErrorContext()));\n    }\n\n    @Override\n    public @Nullable Object key() {\n      throw new UnsupportedOperationException(\n          \"Cannot access key as parameter outside of @OnTimer method.\");\n    }\n\n    @Override\n    public @Nullable Object sideInput(String tagId) {\n      throw new UnsupportedOperationException(\n          String.format(\"SideInput unsupported in %s\", getErrorContext()));\n    }\n\n    @Override\n    public TimerMap timerFamily(String tagId) {\n      throw new UnsupportedOperationException(","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnInvoker.java#L294-L330","documentation":"The default BaseArgumentProvider.element() throws UnsupportedOperationException because element access is only meaningful inside an element-processing context. The message is templated with getErrorContext() naming the unsupported context, indicating the ArgumentProvider installed for this invocation does not carry an element.","triggerScenarios":"Invoking a DoFn method whose ArgumentProvider lacks element support — e.g. calling context.element() from @StartBundle/@FinishBundle, or a test invoker built on the default BaseArgumentProvider.","commonSituations":"Calling element() in bundle lifecycle callbacks instead of @ProcessElement; hand-written test harnesses using BaseArgumentProvider directly; custom runners that forgot to install a ProcessContext-backed ArgumentProvider for @ProcessElement.","solutions":["Move element() access into the @ProcessElement method where a ProcessContext is available","In @StartBundle/@FinishBundle, remove element() access or restructure to use the bundle context","In tests, override element() in your ArgumentProvider stub","Ensure the runner installs an element-aware ArgumentProvider for @ProcessElement invocations"],"exampleFix":"// before\n@StartBundle\npublic void startBundle(StartBundleContext ctx) {\n  process(c.element()); // throws\n}\n// after\n@ProcessElement\npublic void processElement(ProcessContext c) {\n  process(c.element());\n}","handlingStrategy":"type-guard","validationCode":"// Before invoking a DoFn method that uses element():\nboolean isProcessElement = method.isAnnotationPresent(DoFn.ProcessElement.class);\nif (!isProcessElement) {\n  throw new IllegalStateException(\"element() only valid in @ProcessElement context\");\n}","typeGuard":"static boolean hasElementSupport(DoFnInvoker.ArgumentProvider<?, ?> p, DoFn<?, ?> fn) {\n  try { p.element(fn); return true; }\n  catch (UnsupportedOperationException e) { return false; }\n}","tryCatchPattern":"try {\n  InputT el = args.element(doFn);\n} catch (UnsupportedOperationException e) {\n  throw new IllegalStateException(\"element() is only available in @ProcessElement context\", e);\n}","preventionTips":["Never call element() from @StartBundle/@FinishBundle","Keep element access in @ProcessElement signatures (c.element())","Use generated invokers rather than instantiating BaseArgumentProvider directly","Write runner code to install an element-aware ArgumentProvider"],"tags":["java","unsupported-operation","dofn","processcontext"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}