{"record":{"id":"4ebb38136b10b906","repo":"FasterXML/jackson-databind","slug":"cannot-pass-null-deserializers","errorCode":null,"errorMessage":"Cannot pass null Deserializers","messagePattern":"Cannot pass null Deserializers","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/tools/jackson/databind/cfg/DeserializerFactoryConfig.java","lineNumber":93,"sourceCode":"    {\n        _additionalDeserializers = (allAdditionalDeserializers == null) ?\n                NO_DESERIALIZERS : allAdditionalDeserializers;\n        _additionalKeyDeserializers = (allAdditionalKeyDeserializers == null) ?\n                DEFAULT_KEY_DESERIALIZERS : allAdditionalKeyDeserializers;\n        _modifiers = (modifiers == null) ? NO_MODIFIERS : modifiers;\n        _valueInstantiators = (vi == null) ? NO_VALUE_INSTANTIATORS : vi;\n    }\n\n    /**\n     * Fluent/factory method used to construct a configuration object that\n     * has same deserializer providers as this instance, plus one specified\n     * as argument. Additional provider will be added before existing ones,\n     * meaning it has priority over existing definitions.\n     */\n    public DeserializerFactoryConfig withAdditionalDeserializers(Deserializers additional)\n    {\n        if (additional == null) {\n            throw new IllegalArgumentException(\"Cannot pass null Deserializers\");\n        }\n        Deserializers[] all = ArrayBuilders.insertInListNoDup(_additionalDeserializers, additional);\n        return new DeserializerFactoryConfig(all, _additionalKeyDeserializers, _modifiers,\n                _valueInstantiators);\n    }\n\n    /**\n     * Fluent/factory method used to construct a configuration object that\n     * has same key deserializer providers as this instance, plus one specified\n     * as argument. Additional provider will be added before existing ones,\n     * meaning it has priority over existing definitions.\n     */\n    public DeserializerFactoryConfig withAdditionalKeyDeserializers(KeyDeserializers additional)\n    {\n        if (additional == null) {\n            throw new IllegalArgumentException(\"Cannot pass null KeyDeserializers\");\n        }\n        KeyDeserializers[] all = ArrayBuilders.insertInListNoDup(_additionalKeyDeserializers, additional);","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/FasterXML/jackson-databind/blob/a50c7d2a1d57234ac4adf70dbd88ac90db6436e4/src/main/java/tools/jackson/databind/cfg/DeserializerFactoryConfig.java#L75-L111","documentation":"DeserializerFactoryConfig.withAdditionalDeserializers(Deserializers) is the fluent method used (typically by modules) to register an additional Deserializers provider. It rejects null because silently accepting null would later cause NPEs deep in factory resolution; instead it fails fast at registration time with a clear message. This is the entry point SimpleModule.addDeserializer and similar module wiring ultimately call.","triggerScenarios":"Calling config.withAdditionalDeserializers(null), or a module's setupModule/addDeserializers forwarding a null Deserializers (e.g. a lazily-built provider that was never constructed); a list/loop registering providers where one element is null.","commonSituations":"A module that conditionally registers a Deserializers but builds it to null when a feature flag is off; copy-paste module wiring missing the constructor argument; a DI-provided Deserializers bean that is null because its dependency is missing; array/list of providers containing a null entry from a filtered stream.","solutions":["In module wiring, only call withAdditionalDeserializers when the provider is non-null (guard with if (d != null)).","Ensure the Deserializers instance is fully constructed before registration; inject its dependencies eagerly.","Filter nulls out of provider collections before registering: providers.stream().filter(Objects::nonNull).forEach(...).","Add a null-check in your module's addDeserializers to log/skip instead of forwarding null."],"exampleFix":"// before\nDeserializers custom = featureEnabled ? buildCustom() : null;\ncfg.withAdditionalDeserializers(custom); // throws when disabled\n// after\nDeserializers custom = featureEnabled ? buildCustom() : null;\nif (custom != null) cfg.withAdditionalDeserializers(custom);","handlingStrategy":"validation","validationCode":"Deserializers d = ...;\nif (d == null) throw new IllegalArgumentException(\"Deserializers must not be null\");\ncfg.withAdditionalDeserializers(d);","typeGuard":"// non-null reference check","tryCatchPattern":"try {\n    cfg.withAdditionalDeserializers(d);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().equals(\"Cannot pass null Deserializers\")) {\n        // skip registration or build a default provider\n    }\n    throw e;\n}","preventionTips":["Guard module registration with null checks; skip if optional.","Filter nulls from provider collections before the registration loop.","Inject provider beans eagerly so they are never null."],"tags":["module","deserializer","factory-config","null-check","configuration"],"analyzedSha":"a50c7d2a1d57234ac4adf70dbd88ac90db6436e4","analyzedAt":"2026-08-06T20:31:51.404Z","schemaVersion":2},"datasetVersion":"2026-08-07T02:17:10.218Z"}