{"record":{"id":"60a34d1bb8f08796","repo":"apache/beam","slug":"invalid-payload-type-for-urn-60a34d","errorCode":null,"errorMessage":"Invalid payload type for URN ","messagePattern":"Invalid payload type for URN ","errorType":"exception","errorClass":"java.lang.IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdks/java/expansion-service/src/main/java/org/apache/beam/sdk/expansion/service/JavaClassLookupTransformProvider.java","lineNumber":99,"sourceCode":"\n  private static final SchemaRegistry SCHEMA_REGISTRY = SchemaRegistry.createDefault();\n  private final AllowList allowList;\n\n  public JavaClassLookupTransformProvider(AllowList allowList) {\n    if (!allowList.getVersion().equals(ALLOW_LIST_VERSION)) {\n      throw new IllegalArgumentException(\"Unknown allow-list version\");\n    }\n    this.allowList = allowList;\n  }\n\n  @SuppressWarnings(\"argument\")\n  @Override\n  public PTransform<PInput, POutput> getTransform(FunctionSpec spec, PipelineOptions options) {\n    JavaClassLookupPayload payload;\n    try {\n      payload = JavaClassLookupPayload.parseFrom(spec.getPayload());\n    } catch (InvalidProtocolBufferException e) {\n      throw new IllegalArgumentException(\n          \"Invalid payload type for URN \" + getUrn(ExpansionMethods.Enum.JAVA_CLASS_LOOKUP), e);\n    }\n\n    String className = payload.getClassName();\n    try {\n      AllowedClass allowlistClass = allowList.getAllowedClass(className);\n      Class<PTransform<InputT, OutputT>> transformClass =\n          (Class<PTransform<InputT, OutputT>>)\n              ReflectHelpers.findClassLoader().loadClass(className);\n      PTransform<PInput, POutput> transform;\n      Row constructorRow =\n          decodeRow(payload.getConstructorSchema(), payload.getConstructorPayload());\n      if (payload.getConstructorMethod().isEmpty()) {\n        Constructor<?>[] constructors = transformClass.getConstructors();\n        Constructor<PTransform<InputT, OutputT>> constructor =\n            findMappingConstructor(constructors, payload);\n        Object[] parameterValues =\n            getParameterValues(","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/expansion-service/src/main/java/org/apache/beam/sdk/expansion/service/JavaClassLookupTransformProvider.java#L81-L117","documentation":"JavaClassLookupTransformProvider.getTransform parses spec.getPayload() as a JavaClassLookupPayload; on InvalidProtocolBufferException it throws IllegalArgumentException with 'Invalid payload type for URN <JAVA_CLASS_LOOKUP urn>'. The request used the Java class lookup URN but carried bytes of a different payload type.","triggerScenarios":"Expansion request with URN JAVA_CLASS_LOOKUP whose payload is not a serialized JavaClassLookupPayload (wrong payload proto, corrupted bytes, or wrong Beam version building the payload).","commonSituations":"Custom client manually building FunctionSpec; client/service Beam version skew; mixing up payload types between expansion methods.","solutions":["Build the request payload with JavaClassLookupPayload (className, buildMethod etc.) serialized to the FunctionSpec","Match Beam versions between client and expansion service","Verify the URN in the FunctionSpec corresponds to the payload type being sent"],"exampleFix":"// before\nspec.setPayload(schemaTransformPayload.toByteString())\n// after\nspec.setPayload(JavaClassLookupPayload.newBuilder().setClassName(\"com.example.MyTransform\").build().toByteString())","handlingStrategy":"type-guard","validationCode":"assert spec.getUrn().equals(getUrn(ExpansionMethods.Enum.JAVA_CLASS_LOOKUP));\nJavaClassLookupPayload.parseFrom(spec.getPayload()); // dry-run parse before sending","typeGuard":null,"tryCatchPattern":"try { expanded = service.expand(request); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Invalid payload type for URN\")) { /* rebuild JavaClassLookupPayload */ } throw e; }","preventionTips":["Serialize JavaClassLookupPayload via the SDK API","Sync Beam versions between client and service"],"tags":["java","protobuf","payload"],"backgroundTag":"protobuf-unmarshal-failed","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"}