{"record":{"id":"3a7fa5a4cf375e54","repo":"apache/beam","slug":"class-name-must-not-be-empty","errorCode":null,"errorMessage":"Class name must not be empty","messagePattern":"Class name must not be empty","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/transforms/external.py","lineNumber":299,"sourceCode":"        configuration_schema=self._schema_proto,\n        configuration_row=RowCoder(self._schema_proto).encode(\n            dict_to_row(self._schema_proto, self._kwargs)))\n\n\nclass JavaClassLookupPayloadBuilder(PayloadBuilder):\n  \"\"\"\n  Builds a payload for directly instantiating a Java transform using a\n  constructor and builder methods.\n  \"\"\"\n\n  IGNORED_ARG_FORMAT = 'ignore%d'\n\n  def __init__(self, class_name):\n    \"\"\"\n    :param class_name: fully qualified name of the transform class.\n    \"\"\"\n    if not class_name:\n      raise ValueError('Class name must not be empty')\n\n    self._class_name = class_name\n    self._constructor_method = None\n    self._constructor_param_args = None\n    self._constructor_param_kwargs = None\n    self._builder_methods_and_params = OrderedDict()\n\n  def _args_to_named_fields(self, args):\n    next_field_id = 0\n    named_fields = OrderedDict()\n    for value in args:\n      if value is None:\n        raise ValueError(\n            'Received value None. None values are currently not supported')\n      named_fields[(\n          JavaClassLookupPayloadBuilder.IGNORED_ARG_FORMAT %\n          next_field_id)] = value\n      next_field_id += 1","sourceCodeStart":281,"sourceCodeEnd":317,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/transforms/external.py#L281-L317","documentation":"Validation guard in JavaClassLookupPayloadBuilder.__init__: this builder constructs a payload that directly instantiates a Java transform by its fully qualified class name, and an empty/None class_name would produce an invalid expansion request that would only fail later on the expansion service. It fires when callers pass an empty string (e.g., from a blank configuration value or an unset identifier) instead of a real class name.","triggerScenarios":"Constructing the builder with JavaClassLookupPayloadBuilder('') or with a class_name variable that resolved to an empty string.","commonSituations":"Class names read from config files or environment variables that are unset/empty; failed string parsing of a fully qualified name.","solutions":["Pass the fully qualified Java class name, e.g. 'com.example.MyTransform'.","Validate the class_name string is non-empty before constructing the builder.","Fix the config/env source that yielded an empty value."],"exampleFix":"# before\nbuilder = JavaClassLookupPayloadBuilder(config.get('class', ''))\n# after\nclass_name = config.get('class')\nif not class_name:\n  raise ValueError('Java transform class name is required')\nbuilder = JavaClassLookupPayloadBuilder(class_name)","handlingStrategy":"validation","validationCode":"if not class_name:\n    raise ValueError('Java transform class name is required')\nJavaClassLookupPayloadBuilder(class_name)","typeGuard":"def is_valid_class_name(name) -> bool:\n    return isinstance(name, str) and bool(name.strip()) and '.' in name","tryCatchPattern":"try:\n    builder = JavaClassLookupPayloadBuilder(class_name)\nexcept ValueError:\n    raise ValueError('fully qualified Java class name required, got %r' % class_name)","preventionTips":["Require fully qualified names (contain '.') in config.","Fail fast on empty config values at load time.","Use constants/enums for known transform class names."],"tags":["python","apache-beam","cross-language","java"],"backgroundTag":"empty-required-field","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"}