{"record":{"id":"55e761d37b48cf21","repo":"apache/beam","slug":"unable-to-find-codertranslator-for-known-coder","errorCode":null,"errorMessage":"Unable to find CoderTranslator for known Coder","messagePattern":"Unable to find CoderTranslator for known Coder","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/CoderTranslation.java","lineNumber":185,"sourceCode":"    }\n\n    return toCustomCoder(coder);\n  }\n\n  private static RunnerApi.Coder toUnknownCoderWrapper(UnknownCoderWrapper coder) {\n    return RunnerApi.Coder.newBuilder()\n        .setSpec(\n            FunctionSpec.newBuilder()\n                .setUrn(coder.getUrn())\n                .setPayload(ByteString.copyFrom(coder.getPayload())))\n        .build();\n  }\n\n  private static RunnerApi.Coder toKnownCoder(Coder<?> coder, SdkComponents components)\n      throws IOException {\n    CoderTranslator translator = getCoderTranslator(coder.getClass());\n    if (translator == null) {\n      throw new IOException(\"Unable to find CoderTranslator for known Coder\");\n    }\n    List<String> componentIds = registerComponents(coder, translator, components);\n    return RunnerApi.Coder.newBuilder()\n        .addAllComponentCoderIds(componentIds)\n        .setSpec(\n            FunctionSpec.newBuilder()\n                .setUrn(getKnownCoderUrns().get(coder.getClass()))\n                .setPayload(ByteString.copyFrom(translator.getPayload(coder))))\n        .build();\n  }\n\n  private static <T extends Coder<?>> List<String> registerComponents(\n      T coder, CoderTranslator<T> translator, SdkComponents components) throws IOException {\n    List<String> componentIds = new ArrayList<>();\n    for (Coder<?> component : translator.getComponents(coder)) {\n      componentIds.add(components.registerCoder(component));\n    }\n    return componentIds;","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/CoderTranslation.java#L167-L203","documentation":"CoderTranslation.toKnownCoder throws this IOException when a Coder class has no registered CoderTranslator despite being treated as a known coder — i.e. the translation registry lookup returned null while serializing the coder to its RunnerApi proto form.","triggerScenarios":"Serializing a pipeline (SdkComponents/register) with a custom Coder whose class maps into the known-coder path but lacks a CoderTranslator registered via the CoderTranslatorRegistrar ServiceLoader.","commonSituations":"Fat/uber jars built without the META-INF/services CoderTranslatorRegistrar entries; custom coder subclasses overriding the standard ones; shading that strips service files.","solutions":["Ensure META-INF/services/org.apache.beam.sdk.util.construction.CoderTranslatorRegistrar exists in the jar and lists all registrars","Rebuild the fat jar preserving service files (don't merge/shade them away; check shade plugin transformation filters)","Register your custom coder with a CoderTranslatorRegistrar implementation","Verify with CoderTranslation.verifyModelCodersRegistered() early in job startup"],"exampleFix":"// before\npublic class MyCoders { } // no registrar\n// after\npublic class MyCoderRegistrar implements CoderTranslatorRegistrar {\n  public Map<Class<? extends Coder<?>>, String> getCoderURNs() { ... }\n  public List<? extends CoderTranslator<?>> getCoderTranslators() { ... }\n}\n// plus META-INF/services entry naming MyCoderRegistrar","handlingStrategy":"try-catch","validationCode":"CoderTranslation.verifyModelCodersRegistered(); // fail fast at startup\n// and for custom coders ensure a registrar covers coder.getClass()","typeGuard":null,"tryCatchPattern":"try {\n  return CoderTranslation.toProto(coder, components);\n} catch (IOException e) {\n  if (e.getMessage().contains(\"Unable to find CoderTranslator\")) {\n    throw new IllegalStateException(\"Coder \" + coder.getClass() + \" lacks a registered translator\", e);\n  }\n  throw e;\n}","preventionTips":["Keep META-INF/services CoderTranslatorRegistrar entries intact in all jars","Run verifyModelCodersRegistered() in a startup smoke test","Avoid shading Beam SDK without merging service descriptor files"],"tags":["java","beam","coder","serviceloader"],"backgroundTag":"missing-dependency","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"}