{"record":{"id":"14896c3f6db0f8a8","repo":"apache/seatunnel","slug":"describe-object-failed-14896c","errorCode":"DESCRIBE_OBJECT_FAILED","errorMessage":"Failed to build Salesforce table configs","messagePattern":"Failed to build Salesforce table configs","errorType":"error_code","errorClass":"SalesforceConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-salesforce/src/main/java/org/apache/seatunnel/connectors/seatunnel/salesforce/source/SalesforceSource.java","lineNumber":96,"sourceCode":"                    if (duplicate) {\n                        throw new SalesforceConnectorException(\n                                SalesforceConnectorErrorCode.DUPLICATE_OBJECT,\n                                \"Duplicate object in tables_configs: \" + tableId);\n                    }\n                    configs.add(built);\n                }\n                return configs;\n            } else {\n                String objectName = config.get(SalesforceSourceOptions.OBJECT_NAME);\n                String soql = buildSoql(config, objectName);\n                CatalogTable table = client.describeObject(PLUGIN_NAME, objectName);\n                return Collections.singletonList(\n                        new SalesforceTableConfig(soql, objectName, table));\n            }\n        } catch (SalesforceConnectorException e) {\n            throw e;\n        } catch (Exception e) {\n            throw new SalesforceConnectorException(\n                    SalesforceConnectorErrorCode.DESCRIBE_OBJECT_FAILED,\n                    \"Failed to build Salesforce table configs\",\n                    e);\n        }\n    }\n\n    private SalesforceTableConfig buildOneTableConfig(\n            ReadonlyConfig tableConfig, SalesforceClient client) {\n        String tablePath =\n                tableConfig\n                        .getOptional(SalesforceSourceOptions.TABLE_PATH)\n                        .orElseThrow(\n                                () ->\n                                        new SalesforceConnectorException(\n                                                SalesforceConnectorErrorCode.INVALID_TABLE_PATH,\n                                                \"table_path is required in tables_configs\"));\n        String[] parts = tablePath.split(\"\\\\.\", 2);\n        if (parts.length != 2 || StringUtils.isBlank(parts[1])) {","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-salesforce/src/main/java/org/apache/seatunnel/connectors/seatunnel/salesforce/source/SalesforceSource.java#L78-L114","documentation":"Generic wrapper thrown by SalesforceSource.buildTableConfigs when building table configurations fails with an unexpected (non-SalesforceConnectorException) exception. The original exception is attached as the cause and DESCRIBE_OBJECT_FAILED is used as the error code.","triggerScenarios":"Any runtime exception during config building: JSON parsing of config maps, NPEs from missing fields, IO/network errors outside the typed paths, ClassCastExceptions from malformed tables_configs structure.","commonSituations":"Malformed tables_configs entries (wrong types, e.g. string instead of map); schema/config-deserialization bugs; unexpected client errors not wrapped by lower-level codes.","solutions":["Inspect the attached cause exception (print the full stack trace) — it names the real failure","Validate the tables_configs structure: each entry must be a map with table_path and allowed options","Compare with a minimal known-good tables_configs to isolate the bad entry","Upgrade/patch the connector if the cause indicates an internal bug"],"exampleFix":"// before\ntables_configs = [\"Account\"]  // wrong type\n// after\ntables_configs = [{table_path = \"default.Account\"}]","handlingStrategy":"validation","validationCode":"// validate entry shape before building configs\nfor (Object entry : tablesConfigs) {\n    if (!(entry instanceof Map) || !((Map<?,?>) entry).containsKey(\"table_path\")) {\n        throw new IllegalArgumentException(\"Each tables_configs entry must be a map with table_path\");\n    }\n}","typeGuard":"boolean isValidEntry(Object e) {\n    return e instanceof Map && ((Map<?,?>) e).get(\"table_path\") instanceof String;\n}","tryCatchPattern":"try {\n    new SalesforceSource(config);\n} catch (SalesforceConnectorException e) {\n    if (\"Failed to build Salesforce table configs\".equals(e.getMessage())) {\n        e.getCause().printStackTrace(); // real cause\n    }\n}","preventionTips":["Always inspect getCause() — this error is only a wrapper","Validate tables_configs structure with a JSON/config linter before running","Test configs with a minimal single-table setup first","Match connector docs exactly for option names and types"],"tags":["config","salesforce","unexpected-exception"],"backgroundTag":"schema-validation-failed","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}