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
- 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
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
- Serialize JavaClassLookupPayload via the SDK API
- Sync Beam versions between client and service
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
- Invalid payload type for URN
- Aliased enumerations not currently supported.
- Any not yet supported
- Cannot create creator for
- cannot encode a null
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)