{"record":{"id":"388c590410526a14","repo":"lysine-dev/retrofit","slug":"mapper-null","errorCode":null,"errorMessage":"mapper == null","messagePattern":"mapper == null","errorType":"exception","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"retrofit-converters/jackson/src/main/java/retrofit2/converter/jackson/JacksonConverterFactory.java","lineNumber":56,"sourceCode":" */\npublic final class JacksonConverterFactory extends Converter.Factory {\n  private static final MediaType DEFAULT_MEDIA_TYPE =\n      MediaType.get(\"application/json; charset=UTF-8\");\n\n  /** Create an instance using a default {@link ObjectMapper} instance for conversion. */\n  public static JacksonConverterFactory create() {\n    return new JacksonConverterFactory(new ObjectMapper(), DEFAULT_MEDIA_TYPE, false);\n  }\n\n  /** Create an instance using {@code mapper} for conversion. */\n  public static JacksonConverterFactory create(ObjectMapper mapper) {\n    return create(mapper, DEFAULT_MEDIA_TYPE);\n  }\n\n  /** Create an instance using {@code mapper} and {@code mediaType} for conversion. */\n  @SuppressWarnings(\"ConstantConditions\") // Guarding public API nullability.\n  public static JacksonConverterFactory create(ObjectMapper mapper, MediaType mediaType) {\n    if (mapper == null) throw new NullPointerException(\"mapper == null\");\n    if (mediaType == null) throw new NullPointerException(\"mediaType == null\");\n    return new JacksonConverterFactory(mapper, mediaType, false);\n  }\n\n  private final ObjectMapper mapper;\n  private final MediaType mediaType;\n  private final boolean streaming;\n\n  private JacksonConverterFactory(ObjectMapper mapper, MediaType mediaType, boolean streaming) {\n    this.mapper = mapper;\n    this.mediaType = mediaType;\n    this.streaming = streaming;\n  }\n\n  /**\n   * Return a new factory which streams serialization of request messages to bytes on the HTTP thread\n   * This is either the calling thread for {@link Call#execute()}, or one of OkHttp's background\n   * threads for {@link Call#enqueue}. Response bytes are always converted to message instances on","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/lysine-dev/retrofit/blob/d0b112dad073b7fe49c953ebc46ff1b424cb1e51/retrofit-converters/jackson/src/main/java/retrofit2/converter/jackson/JacksonConverterFactory.java#L38-L74","documentation":"Thrown by JacksonConverterFactory.create(ObjectMapper, MediaType) as an explicit NullPointerException when the supplied ObjectMapper is null. The factory holds the mapper for all subsequent conversions; failing at construction surfaces the misconfiguration immediately rather than as an obscure NPE during the first request.","triggerScenarios":"Calling JacksonConverterFactory.create(null) or create(null, mediaType) directly, or passing a null reference from an unbound DI provider, an uninitialized field, or a test mock that returned null.","commonSituations":"A Spring/Dagger bean that injects an ObjectMapper which was never provided, a Kotlin lateinit ObjectMapper field read before initialization, or a test wiring the factory with a null value by accident.","solutions":["Pass a non-null ObjectMapper: use JacksonConverterFactory.create() for a default instance, or create(new ObjectMapper()) / create(objectMapper, mediaType).","If using DI, ensure the ObjectMapper @Provides/@Bean binding is present and returns non-null.","Initialize the ObjectMapper field before constructing the factory.","In tests, pass a real ObjectMapper or a properly stubbed non-null mock."],"exampleFix":"// before\nObjectMapper mapper = diContainer.get(ObjectMapper.class); // null when unbound\nRetrofit retrofit = new Retrofit.Builder()\n    .addConverterFactory(JacksonConverterFactory.create(mapper))\n    .build();\n\n// after\nObjectMapper mapper = diContainer.get(ObjectMapper.class);\nif (mapper == null) mapper = new ObjectMapper();\nRetrofit retrofit = new Retrofit.Builder()\n    .addConverterFactory(JacksonConverterFactory.create(mapper))\n    .build();","handlingStrategy":"validation","validationCode":"ObjectMapper mapper = resolveObjectMapper();\nif (mapper == null) {\n  throw new IllegalStateException(\"ObjectMapper must not be null before building JacksonConverterFactory\");\n}\nJacksonConverterFactory factory = JacksonConverterFactory.create(mapper);","typeGuard":"// Kotlin: non-nullable parameter forces the compiler to reject null at the call site.\nfun converterFactory(mapper: ObjectMapper): JacksonConverterFactory =\n    JacksonConverterFactory.create(mapper)","tryCatchPattern":"JacksonConverterFactory factory;\ntry {\n  factory = JacksonConverterFactory.create(resolveObjectMapper());\n} catch (NullPointerException e) {\n  if (\"mapper == null\".equals(e.getMessage())) {\n    factory = JacksonConverterFactory.create(); // fall back to default ObjectMapper\n  } else {\n    throw e;\n  }\n}","preventionTips":["Prefer JacksonConverterFactory.create() (no-arg) unless you need a customized mapper.","Make ObjectMapper fields final and assign them in the constructor.","In DI, ensure the ObjectMapper @Provides/@Bean binding exists and is covered by a test."],"tags":["retrofit","jackson","null-check","configuration"],"backgroundTag":null,"analyzedSha":"d0b112dad073b7fe49c953ebc46ff1b424cb1e51","analyzedAt":"2026-08-13T23:49:47.955Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}