{"record":{"id":"e56ce76104e83c71","repo":"apache/beam","slug":"dynamicmessage-is-not-allowed-for-the-standard","errorCode":null,"errorMessage":"DynamicMessage is not allowed for the standard ProtoSchemaProvider, use ProtoDynamicMessageSchema  instead.","messagePattern":"DynamicMessage is not allowed for the standard ProtoSchemaProvider, use ProtoDynamicMessageSchema  instead\\.","errorType":"exception","errorClass":"java.lang.RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoMessageSchema.java","lineNumber":154,"sourceCode":"        new ProtoMessageSchema(),\n        TypeDescriptor.of(protoClass),\n        bytes -> protoCoder.getParser().parseFrom(bytes));\n  }\n\n  // Other modules are not allowed to use non-vendored Message class\n  @SuppressWarnings({\n    \"rawtypes\", // TODO(https://github.com/apache/beam/issues/20447)\n    \"unchecked\"\n  })\n  public static <T> SimpleFunction<Row, byte[]> getRowToProtoBytesFn(Class<T> clazz) {\n    Class<Message> protoClass = ensureMessageType(clazz);\n    return RowMessages.rowToBytesFn(\n        new ProtoMessageSchema(), TypeDescriptor.of(protoClass), Message::toByteArray);\n  }\n\n  private <T> void checkForDynamicType(TypeDescriptor<T> typeDescriptor) {\n    if (typeDescriptor.getRawType().equals(DynamicMessage.class)) {\n      throw new RuntimeException(\n          \"DynamicMessage is not allowed for the standard ProtoSchemaProvider, use\"\n              + \" ProtoDynamicMessageSchema  instead.\");\n    }\n  }\n\n  private static Class<Message> ensureMessageType(Class<?> clazz) {\n    checkArgument(\n        Message.class.isAssignableFrom(clazz),\n        \"%s is not a subtype of %s\",\n        clazz.getName(),\n        Message.class.getSimpleName());\n    return (Class<Message>) clazz;\n  }\n}\n","sourceCodeStart":136,"sourceCodeEnd":169,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/protobuf/src/main/java/org/apache/beam/sdk/extensions/protobuf/ProtoMessageSchema.java#L136-L169","documentation":"The standard ProtoSchemaProvider cannot build a schema for DynamicMessage because field information lives in a runtime Descriptor rather than generated accessors. Beam throws this to steer users to ProtoDynamicMessageSchema, which handles descriptor-based messages.","triggerScenarios":"Calling schemaFor (through checkForDynamicType) with TypeDescriptor.of(DynamicMessage.class), e.g. registering DynamicMessage in a Schema registry or creating a schema'd PCollection of DynamicMessage via the standard provider.","commonSituations":"Pipelines parsing protos from descriptors at runtime; code that switched from generated messages to DynamicMessage without updating schema configuration.","solutions":["Use ProtoDynamicMessageSchema / the dynamic message schema provider for DynamicMessage types.","Switch the PCollection element type to a concrete generated Message class.","If dynamic parsing is not needed, use ProtoCoder or generated classes."],"exampleFix":"// before\nschemaRegistry.registerTypeDescriptor(DynamicMessage.class);\n// after\nnew ProtoDynamicMessageSchema(descriptorForType).schemaFor(TypeDescriptor.of(DynamicMessage.class));","handlingStrategy":"type-guard","validationCode":"if (typeDescriptor.getRawType().equals(DynamicMessage.class)) {\n  // route to ProtoDynamicMessageSchema instead\n}","typeGuard":"boolean isDynamic = DynamicMessage.class.equals(type.getRawType());","tryCatchPattern":"try { schema = protoSchema.schemaFor(type); } catch (RuntimeException e) { if (e.getMessage().contains(\"DynamicMessage\")) schema = dynamicSchema.schemaFor(type); else throw e; }","preventionTips":["Never register DynamicMessage with the standard schema provider.","Use ProtoDynamicMessageSchema for descriptor-based messages.","Prefer concrete generated classes in schema'd PCollections."],"tags":["java","protobuf","schema","dynamic-message"],"backgroundTag":"unsupported-operation","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"}