{"record":{"id":"b3ed26598ebb3893","repo":"FasterXML/jackson-databind","slug":"cannot-pass-null-modifier","errorCode":null,"errorMessage":"Cannot pass null modifier","messagePattern":"Cannot pass null modifier","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/tools/jackson/databind/cfg/DeserializerFactoryConfig.java","lineNumber":125,"sourceCode":"    {\n        if (additional == null) {\n            throw new IllegalArgumentException(\"Cannot pass null KeyDeserializers\");\n        }\n        KeyDeserializers[] all = ArrayBuilders.insertInListNoDup(_additionalKeyDeserializers, additional);\n        return new DeserializerFactoryConfig(_additionalDeserializers, all, _modifiers,\n                _valueInstantiators);\n    }\n\n    /**\n     * Fluent/factory method used to construct a configuration object that\n     * has same configuration as this instance plus one additional\n     * deserialiazer modifier. Added modifier has the highest priority (that is, it\n     * gets called before any already registered modifier).\n     */\n    public DeserializerFactoryConfig withDeserializerModifier(ValueDeserializerModifier modifier)\n    {\n        if (modifier == null) {\n            throw new IllegalArgumentException(\"Cannot pass null modifier\");\n        }\n        ValueDeserializerModifier[] all = ArrayBuilders.insertInListNoDup(_modifiers, modifier);\n        return new DeserializerFactoryConfig(_additionalDeserializers, _additionalKeyDeserializers,\n                all, _valueInstantiators);\n    }\n\n    /**\n     * Fluent/factory method used to construct a configuration object that\n     * has same configuration as this instance plus specified additional\n     * value instantiator provider object.\n     * Added instantiator provider has the highest priority (that is, it\n     * gets called before any already registered resolver).\n     *\n     * @param instantiators Object that can provide {@link tools.jackson.databind.deser.ValueInstantiator}s for\n     *    constructing POJO values during deserialization\n     */\n    public DeserializerFactoryConfig withValueInstantiators(ValueInstantiators instantiators)\n    {","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/FasterXML/jackson-databind/blob/87876ca5c0569b4933aec2d30d6225e4b9ba3a43/src/main/java/tools/jackson/databind/cfg/DeserializerFactoryConfig.java#L107-L143","documentation":"Thrown by DeserializerFactoryConfig.withDeserializerModifier(ValueDeserializerModifier) when the argument is null. Jackson forbids registering a null deserializer modifier because modifiers are stored in an array and must be resolvable, so a null entry would break iteration during deserializer construction. It fails fast at registration time rather than later during deserialization.","triggerScenarios":"Calling mapperBuilder or a Module's setupModule with DeserializerFactoryConfig.withDeserializerModifier(null), or passing a null ValueDeserializerModifier when constructing a custom DeserializerFactory configuration. Also triggered indirectly if a module registers a modifier that resolves to null.","commonSituations":"Writing a custom JacksonModule that conditionally adds a modifier and forgets the null guard; wiring a SimpleModule's addDeserializerModifier(null); refactoring that leaves a null where a lambda/anonymous modifier was expected.","solutions":["Guard the call site: only invoke withDeserializerModifier(modifier) when modifier != null.","If you intended a no-op, pass a ValueDeserializerModifier whose methods delegate to the default instead of null.","Check that the expression producing the modifier (factory method, DI lookup) never returns null."],"exampleFix":"// before\nconfig.withDeserializerModifier(maybeModifier());\n\n// after\nValueDeserializerModifier m = maybeModifier();\nif (m != null) {\n    config.withDeserializerModifier(m);\n}","handlingStrategy":"validation","validationCode":"ValueDeserializerModifier modifier = resolveModifier();\nif (modifier == null) {\n    // skip or log; do not call withDeserializerModifier(null)\n} else {\n    config.withDeserializerModifier(modifier);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never pass computed modifier instances without a null check.","Prefer no-op implementations over null when you need a placeholder.","Unit-test module setup paths with conditional modifier registration."],"tags":["jackson","deserialization","config","null-check","builder"],"backgroundTag":null,"analyzedSha":"87876ca5c0569b4933aec2d30d6225e4b9ba3a43","analyzedAt":"2026-08-11T12:55:24.033Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}