{"record":{"id":"897a11042ac62e45","repo":"apache/seatunnel","slug":"conflict-between-body-and-dedicated-airtable-opt","errorCode":null,"errorMessage":"Conflict between 'body' and dedicated Airtable options for keys: %s. Please use either the dedicated option or 'body', not both.","messagePattern":"Conflict between 'body' and dedicated Airtable options for keys: (.+?)\\. Please use either the dedicated option or 'body', not both\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-http/connector-http-airtable/src/main/java/org/apache/seatunnel/connectors/seatunnel/airtable/source/config/AirtableSourceParameter.java","lineNumber":155,"sourceCode":"                pluginConfig, body, AirtableSourceOptions.CELL_FORMAT, \"cellFormat\", conflicts);\n        checkConflict(\n                pluginConfig,\n                body,\n                AirtableSourceOptions.RETURN_FIELDS_BY_FIELD_ID,\n                \"returnFieldsByFieldId\",\n                conflicts);\n        checkConflict(\n                pluginConfig,\n                body,\n                AirtableSourceOptions.RECORD_METADATA,\n                \"recordMetadata\",\n                conflicts);\n        checkConflict(pluginConfig, body, AirtableSourceOptions.TIME_ZONE, \"timeZone\", conflicts);\n        checkConflict(\n                pluginConfig, body, AirtableSourceOptions.USER_LOCALE, \"userLocale\", conflicts);\n        checkConflict(pluginConfig, body, AirtableSourceOptions.OFFSET, \"offset\", conflicts);\n        if (!conflicts.isEmpty()) {\n            throw new IllegalArgumentException(\n                    \"Conflict between 'body' and dedicated Airtable options for keys: \"\n                            + String.join(\", \", conflicts)\n                            + \". Please use either the dedicated option or 'body', not both.\");\n        }\n    }\n\n    private void checkConflict(\n            ReadonlyConfig pluginConfig,\n            Map<String, Object> body,\n            Option<?> option,\n            String bodyKey,\n            List<String> conflicts) {\n        if (pluginConfig.getOptional(option).isPresent() && body.containsKey(bodyKey)) {\n            conflicts.add(bodyKey + \" (option: \" + option.key() + \")\");\n        }\n    }\n\n    private Object parseSort(String sortJson) {","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-http/connector-http-airtable/src/main/java/org/apache/seatunnel/connectors/seatunnel/airtable/source/config/AirtableSourceParameter.java#L137-L173","documentation":"AirtableSourceParameter.checkBodyConflicts throws IllegalArgumentException when the user sets both the generic 'body' option and a dedicated Airtable option (pageSize, timeZone, userLocale, offset, etc.) that map to the same request keys. The two would silently overwrite each other, so the connector refuses the config up front.","triggerScenarios":"Configuring both e.g. body = {pageSize=100, ...} and a separate pageSize option for the Airtable source; triggered from buildRequestBody during source initialization.","commonSituations":"Migrating a config from a raw-HTTP style to Airtable-specific options but forgetting to remove overlapping keys from 'body'.","solutions":["Remove the conflicting keys from the 'body' option and keep only the dedicated options (or vice versa).","Move all request parameters into 'body' if you prefer full control, deleting the dedicated options.","Check the key list in the message to see exactly which options collide."],"exampleFix":"// before\nbody = {pageSize = 100}\npageSize = 50\n// after\npageSize = 50","handlingStrategy":"validation","validationCode":"// Ensure no key in the body object duplicates a dedicated option\nboolean conflict = bodyKeys.stream().anyMatch(Set.of(\"pageSize\",\"timeZone\",\"userLocale\",\"offset\")::contains);","typeGuard":null,"tryCatchPattern":"try { createSource(config); } catch (IllegalArgumentException e) { /* message lists conflicting keys */ }","preventionTips":["Pick one style: dedicated options OR raw body, never both","Keep body minimal and let dedicated options own known keys","Lint configs for duplicate option names"],"tags":["config","airtable","conflict","validation"],"backgroundTag":"conflicting-config-options","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}