ErrLookup › Background articles › "Invalid configuration value" and "Unsupported/Unknown setting value" errors: why libraries reject your config strings, numbers, and types
"Invalid configuration value" and "Unsupported/Unknown setting value" errors: why libraries reject your config strings, numbers, and types
"Invalid configuration value" errors are the family of IllegalArgumentException, ConfigurationException, ValueError, and boot-time ArgumentError messages a library throws when a setting you passed — a provider name, algorithm string, numeric option, or typed property — does not match the closed vocabulary or type the library accepts. You meet them at startup, at first use, or at config-parse time, and the message almost always names the offending value and (often) the list of valid ones. This article walks through how 30 open-source libraries — from Hibernate and Hadoop to Devise, Tailscale, and Deno — produce these errors, the patterns that cause them, and the validation habits that prevent them.
Distilled from 93 documented records across 30 repositories.
Background
Every non-trivial library exposes a configuration surface: string vocabularies (algorithm names, transports, firewall modes), numeric constraints (handler counts, cache capacities), and typed properties in maps (boolean flags, class-typed settings). At some boundary the library must turn loose configuration into internal structures, and that boundary is where this family lives. The validation is usually a switch statement with a default that throws ('Unsupported live copy-edit AI runner', 'Unknown firewall mode', 'Unsupported block buffer'), an enum valueOf() call ('Invalid key reference types'), a type check before use ('Could not determine how to handle configuration raw ... as boolean', 'illegal value for hibernate.connection.datasource'), or a range invariant ('Maximum capacity has to be at least twice the concurrencyLevel'). These guards exist to fail loudly before the misconfiguration silently corrupts behavior — before a bad database id is interpolated into an API filter, before a router starts with too few RPC handlers, or before a cache quietly keeps the wrong reference semantics.
From the caller's side the error looks sudden and specific: the message names the value and frequently the valid set ('Unknown ActionQueue implementation: %s. Valid values are graph and legacy.'). When it fires varies by library and is worth knowing: Hibernate throws during SessionFactory bootstrap; Hadoop's OBS connector fails at FileSystem initialization; the yt-dlp JioSaavn bitrate check is a cached_property that fires at first format extraction; Maven's cache scope and reference-type parsers only log a warning and silently fall back to a default, so the build proceeds with different retention or GC behavior than requested. Library-specific, too, is strictness about casing and whitespace: some paths normalize (Maven trims and lower-cases; Hibernate's flush queue type is case-insensitive), while others compare verbatim (impeorable's opts.provider rejects 'Codex'; Gradle's wrapper rejects 'gradle_user_home').
The family also covers type mistakes, not just vocabulary mistakes. Hibernate's ConfigurationHelper accepts only null, Boolean, and String for boolean settings, so an Integer flag from a YAML bridge becomes a ConfigurationException; loadSettingInstance rejects enum or boxed-primitive values for class-typed settings; the JDBC time-zone setting refuses numeric offsets. A third sub-family is numeric invariant violations: YARN reservation IDs with non-numeric fields, a maintenance replication minimum below zero, Mastra's maxSteps of 0 or NaN, and cache capacities smaller than twice the concurrency level. Finally, some records are defensive guards that stock code cannot hit (Hadoop's Ganglia sink type check) — evidence that a subclass or test populated internal state directly.
What unites all 30 records is that the fix is almost always at the configuration source: correct the spelling or casing, convert the type before it reaches the library, or omit the setting to take the documented default. The deeper remedy is structural — derive values from constants or unions, normalize external input (trim, lowercase, parseInt with validation) at the boundary, and assert config invariants at boot or in CI so bad values fail before production.
Common causes
- Typo or misspelled vocabulary value. The most common trigger across the family: a string that is close to a valid value but not exactly one of the accepted words — 'sof t' for Maven's reference types, 'snowball' for Searchkick's stemmer (only 'hunspell' is supported), 'nft' or 'ipt' instead of 'nftables'/'iptables', 'arrays' instead of 'array' for OBS buffering, 'http' instead of a valid Maven resolver transport.
- Wrong casing or stray whitespace. Many libraries compare verbatim while others normalize, so behavior is library-specific. impeccable rejects provider 'Codex'/'CODEX' because opts.provider is used as-is; Gradle's wrapper rejects 'gradle_user_home' for GRADLE_USER_HOME; Hibernate warns about trailing spaces and quotes in copied property values. Maven by contrast trims and lower-cases cache scope values before parsing.
- Right word, wrong type. The value is semantically correct but the library expects a different runtime type. Hibernate rejects Integer flags for boolean settings, DataSource objects for the JNDI-name-only hibernate.connection.datasource, numeric offsets for hibernate.jdbc.time_zone, and enums for class-typed settings. Devise requires :route to be true, a Symbol, or a Hash — a String or Array raises. Deno's cluster requires the numeric SCHED_RR/SCHED_NONE constants, not the string 'rr'.
- Config value copied from a different system or version. Porting settings between similar-but-different vocabularies: copying fs.s3a.* values into fs.obs.* keys, routing server-side SSE-S3/SSE-KMS algorithms into Hadoop's client-side CSE materials factory, or carrying a hibernate.flush.queue.type value from another Hibernate line ('new', 'default' instead of 'graph'/'legacy').
- Unvalidated external input passed straight to config. Values from ENV, YAML, CLI args, or databases reach the library without normalization: roles read as Strings into Padrino's roles_for (which requires Symbols), maxSteps parsed as Number(env) yielding NaN, strings like '320kbps' passed to yt-dlp's exact-match bitrate set, and a full resource path instead of project:region:instance for PgHero's gcp_database_id.
- Malformed identifier or numeric field. Structurally wrong values that pass a shape check but fail field-level parsing or invariants: a YARN reservation ID with non-numeric timestamp/sequence fields ('reservation_abc_1'), a negative dfs.namenode.maintenance.replication.min, or a bounded map capacity smaller than twice its concurrency level.
- Closures or dynamic values returning the wrong thing. Phalcon Volt's compilation prefix may be a string or a Closure, but the Closure must return a string; a code path that forgets to return (yielding null) throws at compile time. Similarly, programmatically built strings (firewall mode, cache selector syntax) fail when composed without validating against the known set.
- Value that is validly-shaped but semantically out of domain. Some guards reject values that are fine elsewhere in the same product: CSEUtils rejects SSE-* algorithms because only CSE-KMS/CSE-CUSTOM belong there, and Gradle's wrapper rejects raw filesystem paths in distributionBase because only GRADLE_USER_HOME/PROJECT are legal — the correct mechanism for relocation is the GRADLE_USER_HOME environment variable.
What usually fixes it
- [object Object]
- [object Object]
- [object Object]
- [object Object]
- [object Object]
- [object Object]
Documented occurrences
- Unsupported live copy-edit AI runner: ${provider} (pbakaus/impeccable)
- Invalid client side encryption algorithm. Only CSE-KMS and CSE-CUSTOM are supported (apache/hadoop)
- Invalid database id (ankane/pghero)
- Unsupported Address type (apache/hadoop)
- :route should be true, a Symbol or a Hash (heartcombo/devise)
- Configured handlers dfs.federation.router.handler.count= %d is less than the minimum required handlers %d (apache/hadoop)
- Unsupported block buffer "{}" (apache/hadoop)
- Unknown type: #{type} (activeadmin/activeadmin)
- Could not determine how to handle configuration raw [name=${name}, value=${raw}] as boolean (hibernate/hibernate-orm)
- Invalid reservationId: {} specified for the app: {} (apache/hadoop)
- The unique compilation prefix is invalid (phalcon/cphalcon)
- Role #{role} must be present and must be a symbol! (padrino/padrino-framework)
- Configuration property hibernate.jdbc.time_zone value [{}] is not supported (hibernate/hibernate-orm)
- Invalid key reference types '{}', using defaults (apache/maven)
- Unexpected configuration parameters: dfs.namenode.maintenance.replication.min = {minMaintenanceR} < 0 (apache/hadoop)
- unknown firewall mode %v (tailscale/tailscale)
- illegal value for configuration setting 'hibernate.connection.datasource' (hibernate/hibernate-orm)
- Invalid bitrate(s): {", ".join(invalid_bitrates)}. Valid bitrates are: {", ".join(sorted(self._VALID_BITRATES, key=int))} (yt-dlp/yt-dlp)
- Base: is unknown (gradle/gradle)
- cave_mastra_max_steps_invalid: cave_mastra_max_steps_invalid (JuliusBrussee/caveman)
…and 73 more across the corpus — use search.
Honest provenance: generated on 2026-08-28 from AI-assisted analysis of the linked records. See how records are made.