{"record":{"id":"71562634b8cd3a3b","repo":"apache/beam","slug":"cannot-provide-coder-for-parameterized-type-s-s","errorCode":null,"errorMessage":"Cannot provide coder for parameterized type %s: %s","messagePattern":"Cannot provide coder for parameterized type (.+?): (.+?)","errorType":"exception","errorClass":"CannotProvideCoderException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java","lineNumber":664,"sourceCode":"\n  /**\n   * Returns a {@link Coder} to use for values of the given parameterized type, in a context where\n   * the given types use the given {@link Coder Coders}.\n   *\n   * @throws CannotProvideCoderException if no coder can be provided\n   */\n  private Coder<?> getCoderFromParameterizedType(\n      ParameterizedType type, SetMultimap<Type, Coder<?>> typeCoderBindings)\n      throws CannotProvideCoderException {\n\n    List<Coder<?>> typeArgumentCoders = new ArrayList<>();\n    for (Type typeArgument : type.getActualTypeArguments()) {\n      try {\n        Coder<?> typeArgumentCoder =\n            getCoderFromTypeDescriptor(TypeDescriptor.of(typeArgument), typeCoderBindings);\n        typeArgumentCoders.add(typeArgumentCoder);\n      } catch (CannotProvideCoderException exc) {\n        throw new CannotProvideCoderException(\n            String.format(\n                \"Cannot provide coder for parameterized type %s: %s\", type, exc.getMessage()),\n            exc);\n      }\n    }\n    return getCoderFromFactories(TypeDescriptor.of(type), typeArgumentCoders);\n  }\n\n  /**\n   * Attempts to create a {@link Coder} from any registered {@link CoderProvider} returning the\n   * first successfully created instance.\n   */\n  private Coder<?> getCoderFromFactories(\n      TypeDescriptor<?> typeDescriptor, List<Coder<?>> typeArgumentCoders)\n      throws CannotProvideCoderException {\n    List<CannotProvideCoderException> suppressedExceptions = new ArrayList<>();\n    for (CoderProvider coderProvider : coderProviders) {\n      try {","sourceCodeStart":646,"sourceCodeEnd":682,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderRegistry.java#L646-L682","documentation":"While resolving coders for a parameterized type's arguments, at least one type argument itself could not get a coder. getCoderFromParameterizedType catches that CannotProvideCoderException and rethrows a new one with this message, which names the whole parameterized type and the underlying reason, preserving the cause. It is a contextual wrapper, not a distinct failure mode.","triggerScenarios":"getCoder on a ParameterizedType (e.g. Map<K,V>, Pair<A,B>) where any actual type argument fails getCoderFromTypeDescriptor — no registered coder/factory for it, wildcard argument, over-specified binding, etc.","commonSituations":"KV<CustomType, String> where CustomType lacks a registered coder; nested generics like List<Map<String, MyPojo>> with an uncodable leaf type; using a type variable in an anonymous subclass that resolves to nothing.","solutions":["Read the exception cause to find the exact failing type argument.","Register a coder for the failing type via registerCoderForType or implement a CoderFactory / @DefaultCoder annotation on the class.","Replace the uncodable type argument with a codable one."],"exampleFix":"// before\n// KV<MyPojo, Integer> with no coder for MyPojo\n// after\nregistry.registerCoderForType(TypeDescriptor.of(MyPojo.class), new MyPojoCoder());","handlingStrategy":"try-catch","validationCode":"for (Type arg : ((ParameterizedType) type).getActualTypeArguments()) {\n  try { registry.getCoder(TypeDescriptor.of(arg)); }\n  catch (CannotProvideCoderException e) { /* arg needs a registered coder */ }\n}","typeGuard":null,"tryCatchPattern":"try {\n  coder = registry.getCoder(parameterizedDescriptor);\n} catch (CannotProvideCoderException e) {\n  // inspect e.getCause() for the failing type argument, register a coder, retry\n}","preventionTips":["Register coders for all leaf types used inside generic containers.","Use @DefaultCoder annotations on domain classes.","Test coder resolution for your full generic type graph before running pipelines."],"tags":["java","apache-beam","coders","generics"],"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"}