{"record":{"id":"77660a4e16e55158","repo":"apache/beam","slug":"unable-to-get-result-coder","errorCode":null,"errorMessage":"Unable to get result coder","messagePattern":"Unable to get result coder","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/ordered/src/main/java/org/apache/beam/sdk/extensions/ordered/OrderedEventProcessor.java","lineNumber":137,"sourceCode":"    Coder<EventT> eventCoder;\n    try {\n      eventCoder = handler.getEventCoder(pipeline, input.getCoder());\n    } catch (CannotProvideCoderException e) {\n      throw new RuntimeException(\"Unable to get event coder\", e);\n    }\n\n    Coder<StateT> stateCoder;\n    try {\n      stateCoder = handler.getStateCoder(pipeline);\n    } catch (CannotProvideCoderException e) {\n      throw new RuntimeException(\"Unable to get state coder\", e);\n    }\n\n    Coder<ResultT> resultCoder;\n    try {\n      resultCoder = handler.getResultCoder(pipeline);\n    } catch (CannotProvideCoderException e) {\n      throw new RuntimeException(\"Unable to get result coder\", e);\n    }\n\n    KvCoder<EventKeyT, ResultT> mainOutputCoder = KvCoder.of(keyCoder, resultCoder);\n    KvCoder<EventKeyT, OrderedProcessingStatus> processingStatusCoder =\n        KvCoder.of(keyCoder, getOrderedProcessingStatusCoder(pipeline));\n    KvCoder<EventKeyT, KV<Long, UnprocessedEvent<EventT>>> unprocessedEventsCoder =\n        KvCoder.of(\n            keyCoder, KvCoder.of(VarLongCoder.of(), new UnprocessedEventCoder<>(eventCoder)));\n\n    if (handler instanceof OrderedProcessingGlobalSequenceHandler) {\n      OrderedProcessingGlobalSequenceHandler<EventT, EventKeyT, StateT, ResultT>\n          globalSequenceHandler =\n              (OrderedProcessingGlobalSequenceHandler<EventT, EventKeyT, StateT, ResultT>) handler;\n\n      return expandGlobalSequenceProcessing(\n          input,\n          mainOutput,\n          statusOutput,","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/ordered/src/main/java/org/apache/beam/sdk/extensions/ordered/OrderedEventProcessor.java#L119-L155","documentation":"OrderedEventProcessor.expand() obtains the result coder via handler.getResultCoder(pipeline); a CannotProvideCoderException is rethrown as this RuntimeException. The result coder is required to build the KvCoder for the processor's main output PCollection<KV<EventKeyT, ResultT>>.","triggerScenarios":"expand() invoked with a handler whose ResultT type has no inferable coder — custom result class without a CoderProvider, erased generics, or a handler implementation that delegates to coder inference which throws CannotProvideCoderException.","commonSituations":"Custom result types (e.g. user-defined processing outcome records) without coder registration; changing the ResultT type parameter without updating coder configuration; running on a runner requiring coders earlier than expected.","solutions":["Configure an explicit result coder on the handler (coder supplier for ResultT) at construction time.","Register a CoderProvider or add @DefaultCoder to the result class.","Override getResultCoder in the handler to return a concrete coder.","Verify ResultT's TypeDescriptor resolves to a concrete class."],"exampleFix":"// before\nhandler -> coder inference fails for MyResult\n// after\n.setCoderForType(TypeDescriptor.of(MyResult.class), AvroCoder.of(MyResult.class)) // or @DefaultCoder(AvroCoder.class) on MyResult","handlingStrategy":"validation","validationCode":"try {\n  handler.getResultCoder(pipeline);\n} catch (CannotProvideCoderException e) {\n  throw new IllegalStateException(\"ResultT needs a registered coder; add @DefaultCoder or a coder supplier\", e);\n}","typeGuard":"static <ResultT> boolean resultCoderResolvable(ComposedAccumulatingProcessingHandler<?, ?, ?, ResultT, ?> h, Pipeline p) {\n  try { h.getResultCoder(p); return true; } catch (CannotProvideCoderException e) { return false; }\n}","tryCatchPattern":"try {\n  pipeline.apply(processor);\n} catch (RuntimeException e) {\n  if (e.getCause() instanceof CannotProvideCoderException) {\n    throw new IllegalStateException(\"Set an explicit result coder for ResultT\", e);\n  }\n  throw e;\n}","preventionTips":["Register coders for every type parameter used in the processor","Prefer concrete result classes over generics-inferred ones","Run a smoke-test pipeline before production deployment"],"tags":["apache-beam","coder","output","pipeline-construction"],"backgroundTag":"type-mismatch","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"}