apache/beam · error · java.lang.IllegalArgumentException

Invalid payload type for URN

Error message

Invalid payload type for URN 

What it means

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.

Solutions

  1. Build the request payload with JavaClassLookupPayload (className, buildMethod etc.) serialized to the FunctionSpec
  2. Match Beam versions between client and expansion service
  3. Verify the URN in the FunctionSpec corresponds to the payload type being sent

Example fix

// before
spec.setPayload(schemaTransformPayload.toByteString())
// after
spec.setPayload(JavaClassLookupPayload.newBuilder().setClassName("com.example.MyTransform").build().toByteString())
Defensive patterns

Strategy: type-guard

Validate before calling

assert spec.getUrn().equals(getUrn(ExpansionMethods.Enum.JAVA_CLASS_LOOKUP));
JavaClassLookupPayload.parseFrom(spec.getPayload()); // dry-run parse before sending

Try / catch

try { expanded = service.expand(request); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith("Invalid payload type for URN")) { /* rebuild JavaClassLookupPayload */ } throw e; }

Prevention

When it happens

Trigger: 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).

Common situations: Custom client manually building FunctionSpec; client/service Beam version skew; mixing up payload types between expansion methods.

Understand the failure class

Background: "cannot parse invalid wire-format data", "cannot unmarshal", "failed unmarshalling": protobuf unmarshal errors explained — this error's family across 10 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/60a34d1bb8f08796. Report an issue: GitHub.

Appendix: source

Thrown at sdks/java/expansion-service/src/main/java/org/apache/beam/sdk/expansion/service/JavaClassLookupTransformProvider.java:99

  private static final SchemaRegistry SCHEMA_REGISTRY = SchemaRegistry.createDefault();
  private final AllowList allowList;

  public JavaClassLookupTransformProvider(AllowList allowList) {
    if (!allowList.getVersion().equals(ALLOW_LIST_VERSION)) {
      throw new IllegalArgumentException("Unknown allow-list version");
    }
    this.allowList = allowList;
  }

  @SuppressWarnings("argument")
  @Override
  public PTransform<PInput, POutput> getTransform(FunctionSpec spec, PipelineOptions options) {
    JavaClassLookupPayload payload;
    try {
      payload = JavaClassLookupPayload.parseFrom(spec.getPayload());
    } catch (InvalidProtocolBufferException e) {
      throw new IllegalArgumentException(
          "Invalid payload type for URN " + getUrn(ExpansionMethods.Enum.JAVA_CLASS_LOOKUP), e);
    }

    String className = payload.getClassName();
    try {
      AllowedClass allowlistClass = allowList.getAllowedClass(className);
      Class<PTransform<InputT, OutputT>> transformClass =
          (Class<PTransform<InputT, OutputT>>)
              ReflectHelpers.findClassLoader().loadClass(className);
      PTransform<PInput, POutput> transform;
      Row constructorRow =
          decodeRow(payload.getConstructorSchema(), payload.getConstructorPayload());
      if (payload.getConstructorMethod().isEmpty()) {
        Constructor<?>[] constructors = transformClass.getConstructors();
        Constructor<PTransform<InputT, OutputT>> constructor =
            findMappingConstructor(constructors, payload);
        Object[] parameterValues =
            getParameterValues(

View on GitHub (pinned to 12126d8942)