{"record":{"id":"40b3d5c6bf2f59b4","repo":"spring-projects/spring-security","slug":"cannot-find-json-converter-on-the-classpath-add-o","errorCode":null,"errorMessage":"Cannot find JSON Converter on the classpath. Add one following classes to the classpath tools.jackson.databind.json.JsonMapper, com.fasterxml.jackson.databind.ObjectMapper, tools.jackson.databind.json.JsonMapper, com.google.gson.Gson, jakarta.json.bind.Jsonb","messagePattern":"Cannot find JSON Converter on the classpath\\. Add one following classes to the classpath tools\\.jackson\\.databind\\.json\\.JsonMapper, com\\.fasterxml\\.jackson\\.databind\\.ObjectMapper, tools\\.jackson\\.databind\\.json\\.JsonMapper, com\\.google\\.gson\\.Gson, jakarta\\.json\\.bind\\.Jsonb","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"web/src/main/java/org/springframework/security/web/authentication/HttpMessageConverters.java","lineNumber":83,"sourceCode":"\t/**\n\t * Gets the {@link GenericHttpMessageConverterAdapter} to use for JSON.\n\t * @return the {@link GenericHttpMessageConverterAdapter} to use.\n\t */\n\t@SuppressWarnings(\"removal\")\n\tstatic GenericHttpMessageConverter<Object> getJsonMessageConverter() {\n\t\tif (jacksonPresent) {\n\t\t\treturn new GenericHttpMessageConverterAdapter<>(new JacksonJsonHttpMessageConverter());\n\t\t}\n\t\tif (jackson2Present) {\n\t\t\treturn new MappingJackson2HttpMessageConverter();\n\t\t}\n\t\tif (gsonPresent) {\n\t\t\treturn new GsonHttpMessageConverter();\n\t\t}\n\t\tif (jsonbPresent) {\n\t\t\treturn new JsonbHttpMessageConverter();\n\t\t}\n\t\tthrow new IllegalStateException(\n\t\t\t\t\"Cannot find JSON Converter on the classpath. Add one following classes to the classpath \"\n\t\t\t\t\t\t+ String.join(\", \", JSON_MAPPER, OBJECT_MAPPER, JSON_MAPPER, GSON, JSONB));\n\t}\n\n}\n","sourceCodeStart":65,"sourceCodeEnd":89,"githubUrl":"https://github.com/spring-projects/spring-security/blob/96852e8860138a482cb13d1479573f24ff6443c6/web/src/main/java/org/springframework/security/web/authentication/HttpMessageConverters.java#L65-L89","documentation":"HttpMessageConverters.getJsonMessageConverter() detects a JSON library on the classpath (Jackson 3 tools.jackson, Jackson 2 ObjectMapper, Gson, or JSON-B) and returns the matching HttpMessageConverter. If none is present it throws IllegalStateException, because JSON-based features (e.g. JSON login) cannot serialize/deserialize without a converter.","triggerScenarios":"Using a Spring Security feature that builds default HttpMessageConverters (e.g. a JSON login filter or OAuth2 token endpoint filters) in an application whose classpath contains none of: tools.jackson JsonMapper, com.fasterxml ObjectMapper, Gson, or jakarta.json.bind Jsonb.","commonSituations":"Minimal/slim Spring Boot apps excluding Jackson (spring-boot-starter-json removed); plain servlet apps using only spring-security-web; dependency exclusions stripping jackson-databind during dependency convergence fixes.","solutions":["Add a JSON dependency: spring-boot-starter-json (Jackson) or explicit com.fasterxml.jackson.core:jackson-databind, tools.jackson jackson 3, com.google.code.gson:gson, or a JSON-B provider (e.g. Yasson)","If Jackson was excluded to fix conflicts, re-add the correct version instead of removing entirely","Verify with mvn dependency:tree / gradle dependencies that one of the mapper classes is on runtime classpath"],"exampleFix":"// before\n<exclusions><exclusion>\n  <groupId>com.fasterxml.jackson.core</groupId>\n  <artifactId>jackson-databind</artifactId>\n</exclusion></exclusions>\n// after\n<dependency>\n  <groupId>org.springframework.boot</groupId>\n  <artifactId>spring-boot-starter-json</artifactId>\n</dependency>","handlingStrategy":"fallback","validationCode":"ClassPathPresence:\nboolean hasJson = streamOf(\"tools.jackson.databind.json.JsonMapper\",\n    \"com.fasterxml.jackson.databind.ObjectMapper\",\n    \"com.google.gson.Gson\", \"jakarta.json.bind.Jsonb\").anyMatch(ClassUtils::isPresent);","typeGuard":"boolean jsonAvailable() {\n    return ClassUtils.isPresent(\"com.fasterxml.jackson.databind.ObjectMapper\", getClass().getClassLoader())\n        || ClassUtils.isPresent(\"tools.jackson.databind.json.JsonMapper\", getClass().getClassLoader());\n}","tryCatchPattern":"try {\n    converter = HttpMessageConverters.getJsonMessageConverter();\n} catch (IllegalStateException e) {\n    log.error(\"No JSON library on classpath — add jackson-databind or gson\", e);\n    throw e;\n}","preventionTips":["Include spring-boot-starter-json when using Spring Security web features","Re-check dependency exclusions after conflict resolution","Run a classpath smoke test (ClassUtils.isPresent) at startup"],"tags":["spring-security","classpath","json","missing-dependency","jackson"],"backgroundTag":"missing-optional-dependency","analyzedSha":"96852e8860138a482cb13d1479573f24ff6443c6","analyzedAt":"2026-09-10T23:25:23.477Z","contentChangedAt":"2026-09-10T23:25:23.477Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}