{"record":{"id":"1d9777054e6b2626","repo":"apache/beam","slug":"unable-to-provide-coder-for-s-this-factory-can-only-provide","errorCode":null,"errorMessage":"Unable to provide coder for %s, this factory can only provide coders for %s","messagePattern":"Unable to provide coder for (.+?), this factory can only provide coders for (.+?)","errorType":"exception","errorClass":"CannotProvideCoderException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderProviders.java","lineNumber":65,"sourceCode":"  }\n\n  /** Creates a {@link CoderProvider} that always returns the given coder for the specified type. */\n  public static CoderProvider forCoder(TypeDescriptor<?> type, Coder<?> coder) {\n    return new CoderProviderForCoder(type, coder);\n  }\n\n  /**\n   * See {@link #fromStaticMethods} for a detailed description of the characteristics of this {@link\n   * CoderProvider}.\n   */\n  private static class CoderProviderFromStaticMethods extends CoderProvider {\n\n    @SuppressFBWarnings(\"DCN_NULLPOINTER_EXCEPTION\") // TODO(#35312)\n    @Override\n    public <T> Coder<T> coderFor(TypeDescriptor<T> type, List<? extends Coder<?>> componentCoders)\n        throws CannotProvideCoderException {\n      if (!this.rawType.equals(type.getRawType())) {\n        throw new CannotProvideCoderException(\n            String.format(\n                \"Unable to provide coder for %s, this factory can only provide coders for %s\",\n                type, this.rawType));\n      }\n      try {\n        return (Coder<T>)\n            Preconditions.checkStateNotNull(\n                factoryMethod.invoke(this.rawType /* ignored */, componentCoders.toArray()));\n      } catch (IllegalAccessException\n          | IllegalArgumentException\n          | InvocationTargetException\n          | NullPointerException\n          | ExceptionInInitializerError exn) {\n        throw new IllegalStateException(\n            \"error when invoking Coder factory method \" + factoryMethod, exn);\n      }\n    }\n","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/coders/CoderProviders.java#L47-L83","documentation":"CoderProviders.coderFor throws CannotProvideCoderException when the requested TypeDescriptor's raw type does not match the raw type this factory was built for. The factory only supplies coders for its single registered type, so a mismatch means it cannot serve the request.","triggerScenarios":"Calling coderFor with a TypeDescriptor whose raw type differs from the factory's rawType — e.g. asking a factory registered for String to provide a coder for Integer, or a subclass/generic variant that changes the raw type.","commonSituations":"Registering a CoderProvider for one class but expecting it to cover subclasses or generics, coder auto-detection through a provider list with the wrong type wired in, refactors renaming or generifying the coded class.","solutions":["Register the correct CoderProvider for the actual type (e.g. CoderProviders.fromStaticMethods(MyType.class, \"getCoder\"))","Ensure the factory's rawType matches the requested type exactly","Add a CoderRegistry fallback chain so other providers can handle other types","Provide the coder explicitly with setCoder instead of relying on provider lookup"],"exampleFix":"// before\nCoderProviders.fromStaticMethods(String.class, \"getCoder\") // asked for Integer\n// after\nCoderProviders.fromStaticMethods(Integer.class, \"getCoder\");","handlingStrategy":"validation","validationCode":"if (!factorySupports(rawType)) { throw new IllegalArgumentException(\"no CoderProvider registered for \" + rawType); }","typeGuard":"static <T> boolean providerSupports(CoderProviderFactory f, TypeDescriptor<T> t) { return f.getRawType().equals(t.getRawType()); }","tryCatchPattern":"try { Coder<T> c = provider.coderFor(type, comps); } catch (CannotProvideCoderException e) { /* fall through to next provider or registry.defaultCoder(type) */ }","preventionTips":["Register one provider per concrete class and test coder resolution in unit tests","Prefer explicit registry.registerCoderForClass over implicit provider chains for exotic types"],"tags":["java","beam","coders","type-mismatch"],"backgroundTag":"type-mismatch","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"}