{"record":{"id":"74ae0f05a81113e2","repo":"elastic/elasticsearch","slug":"exactly-one-provider-object-must-be-specified-but","errorCode":null,"errorMessage":"Exactly one provider object must be specified, but [{}] were found","messagePattern":"Exactly one provider object must be specified, but \\[(.+?)\\] were found","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/ip-location/src/main/java/org/elasticsearch/ingest/geoip/direct/DatabaseConfiguration.java","lineNumber":107,"sourceCode":"    );\n\n    private static final ParseField NAME = new ParseField(\"name\");\n    private static final ParseField MAXMIND = new ParseField(Maxmind.NAME);\n    private static final ParseField IPINFO = new ParseField(Ipinfo.NAME);\n    private static final ParseField WEB = new ParseField(Web.NAME);\n    private static final ParseField LOCAL = new ParseField(Local.NAME);\n\n    private static final ConstructingObjectParser<DatabaseConfiguration, String> PARSER = new ConstructingObjectParser<>(\n        \"database\",\n        false,\n        (a, id) -> {\n            String name = (String) a[0];\n            Provider provider;\n\n            // one and only one provider object must be present\n            final long numNonNulls = Arrays.stream(a, 1, a.length).filter(Objects::nonNull).count();\n            if (numNonNulls != 1) {\n                throw new IllegalArgumentException(\"Exactly one provider object must be specified, but [\" + numNonNulls + \"] were found\");\n            }\n\n            if (a[1] != null) {\n                provider = (Maxmind) a[1];\n            } else if (a[2] != null) {\n                provider = (Ipinfo) a[2];\n            } else if (a[3] != null) {\n                provider = (Web) a[3];\n            } else {\n                provider = (Local) a[4];\n            }\n            return new DatabaseConfiguration(id, name, provider);\n        }\n    );\n\n    static {\n        PARSER.declareString(ConstructingObjectParser.constructorArg(), NAME);\n        PARSER.declareObject(","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/modules/ip-location/src/main/java/org/elasticsearch/ingest/geoip/direct/DatabaseConfiguration.java#L89-L125","documentation":"Thrown by the DatabaseConfiguration ConstructingObjectParser when the number of non-null provider objects in a database configuration is not exactly one. The parser reserves slots for Maxmind, Ipinfo, Web, and Local providers and requires exactly one to be supplied; zero (missing provider) or more than one (ambiguous) both fail. IllegalArgumentException surfaces during API request parsing.","triggerScenarios":"Creating/updating a database configuration via the API where the request body includes zero provider objects or two-or-more provider objects simultaneously. Arrays.stream(a, 1, a.length).filter(nonNull).count() != 1 -> throw.","commonSituations":"User omits the provider block entirely; user supplies both maxmind and ipinfo in one config; copy-paste error merging two example configs; client library sending null vs empty object confusion leading to multiple non-nulls.","solutions":["Include exactly one provider object (maxmind, ipinfo, web, or local) in the database configuration body.","Remove any duplicate or conflicting provider block before submitting.","Validate the request body shape against the rest-api-spec example for the endpoint.","If writing automation, assert the provider count in a preflight check."],"exampleFix":"// before\n{\"name\":\"city\",\"maxmind\":{\"account_id\":\"x\",\"license_key\":\"y\"},\"ipinfo\":{\"token\":\"z\"}}\n// after\n{\"name\":\"city\",\"maxmind\":{\"account_id\":\"x\",\"license_key\":\"y\"}}","handlingStrategy":"validation","validationCode":"long countProviders(Object... a) {\n    return Arrays.stream(a, 1, a.length).filter(Objects::nonNull).count();\n}\n// call before submit: assert countProviders(...) == 1","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include exactly one provider object in a database configuration.","Validate the provider count in client code before submitting.","Match request bodies to the rest-api-spec examples.","Add client-side schema validation that rejects zero or multiple providers."],"tags":["geoip","provider","configuration","api-contract","validation"],"backgroundTag":null,"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}