{"record":{"id":"6b18db96e06a5419","repo":"apache/beam","slug":"no-translator-known-for-s","errorCode":null,"errorMessage":"No translator known for %s","messagePattern":"No translator known for (.+?)","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/PTransformTranslation.java","lineNumber":317,"sourceCode":"    return tag.getId();\n  }\n\n  /** Returns the URN for the transform if it is known, otherwise {@code null}. */\n  public static @Nullable String urnForTransformOrNull(PTransform<?, ?> transform) {\n    TransformTranslator<?> transformTranslator =\n        Iterables.find(\n            KNOWN_TRANSLATORS,\n            translator -> translator.canTranslate(transform),\n            DefaultUnknownTransformTranslator.INSTANCE);\n    return ((TransformTranslator) transformTranslator).getUrn(transform);\n  }\n\n  /** Returns the URN for the transform if it is known, otherwise throws. */\n  public static String urnForTransform(PTransform<?, ?> transform) {\n    String urn = urnForTransformOrNull(transform);\n\n    if (urn == null) {\n      throw new IllegalStateException(\n          String.format(\"No translator known for %s\", transform.getClass().getName()));\n    }\n    return urn;\n  }\n\n  /** Returns the URN for the transform if it is known, otherwise {@code null}. */\n  public static @Nullable String urnForTransformOrNull(RunnerApi.PTransform transform) {\n    return transform.getSpec() == null ? null : transform.getSpec().getUrn();\n  }\n\n  /**\n   * A translator between a Java-based {@link PTransform} and a protobuf for that transform.\n   *\n   * <p>When going to a protocol buffer message, the translator produces a payload corresponding to\n   * the Java representation while registering components that transform references.\n   */\n  public interface TransformTranslator<T extends PTransform<?, ?>> {\n    @Nullable String getUrn(T transform);","sourceCodeStart":299,"sourceCodeEnd":335,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/util/construction/PTransformTranslation.java#L299-L335","documentation":"PTransformTranslation.urnForTransform resolves the URN for a PTransform via registered payload translators; urnForTransformOrNull returns null when no registered translator supports the transform class. This IllegalStateException then reports that no translator is known for the given class name.","triggerScenarios":"Calling urnForTransform (directly or via pipeline translation) with a custom PTransform subclass that has no registered PTransformTranslator/PTransformPayloadTranslator, or with a built-in transform whose translator ServiceLoader entry is missing from the classpath.","commonSituations":"Custom composite/leaf transforms used without a custom translator registration (WriteableTransform registries); shaded jars dropping META-INF/services registrations; passing a plain DoFn-wrapped custom transform where Impulse/ParDo expansion is expected.","solutions":["Register a payload translator for the custom transform class (extend PTransformTranslation.PTransformPayloadTranslator and register it via ServiceLoader or the appropriate registry).","Replace the unknown transform with an expandable composite of built-in transforms (ParDo, GroupByKey, etc.) so no custom URN is needed.","Check META-INF/services/org.apache.beam.sdk.transforms.reflect.PTransformTranslator (or equivalent) is intact in the classpath; fix shading config.","Use urnForTransformOrNull if you only need a nullable lookup instead of a throw."],"exampleFix":"// before\napply(new MyCustomTransform()); // IllegalStateException: No translator known for ...\n// after\n@AutoService(PTransformPayloadTranslator.class)\nclass MyCustomTransformTranslator implements PTransformPayloadTranslator<MyCustomTransform> { ... }","handlingStrategy":"validation","validationCode":"if (PTransformTranslation.urnForTransformOrNull(transform) == null) { throw new IllegalStateException(\"Register a translator for \" + transform.getClass().getName()); }","typeGuard":"boolean translatable(PTransform<?, ?> t) { return PTransformTranslation.urnForTransformOrNull(t) != null; }","tryCatchPattern":"try { String urn = PTransformTranslation.urnForTransform(transform); } catch (IllegalStateException e) { /* register translator or replace transform */ throw e; }","preventionTips":["Register payload translators for every custom PTransform","Verify META-INF/services entries survive shading","Prefer composites of built-in transforms when no translator exists"],"tags":["java","translation","urn","registration"],"backgroundTag":"unsupported-operation","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"}