FasterXML/jackson-databind · error · IllegalArgumentException

Module ({}) without defined version

Error message

Module ({}) without defined version

What it means

Thrown by MapperBuilder._verifyModuleMetadata when a Jackson module being registered has a null version(). Every module is validated (name AND version) because version metadata drives diagnostics, ordering, and dependency resolution. A null version means the module implementation is incomplete.

Source

Thrown at src/main/java/tools/jackson/databind/cfg/MapperBuilder.java:1139

    {
        _verifyModuleMetadata(module);
        final Object moduleId = module.getRegistrationId();
        if (_modules.containsKey(moduleId)) {
            return;
        }
        for (JacksonModule dep : module.getDependencies()) {
            _addDependency(dep);
        }
        _modules.put(moduleId, module);
    }

    private void _verifyModuleMetadata(JacksonModule module)
    {
        if (module.getModuleName() == null) {
            throw new IllegalArgumentException("Module ("+module.getClass().getName()+") without defined name");
        }
        if (module.version() == null) {
            throw new IllegalArgumentException("Module ("+module.getClass().getName()+") without defined version");
        }
    }

    public B addModules(JacksonModule... modules)
    {
        for (JacksonModule module : modules) {
            addModule(module);
        }
        return _this();
    }

    public B addModules(Iterable<? extends JacksonModule> modules)
    {
        for (JacksonModule module : modules) {
            addModule(module);
        }
        return _this();
    }

View on GitHub (pinned to a50c7d2a1d)

Solutions

  1. Override version() to return a non-null Version, e.g. new Version(1, 0, 0, null, "com.example", "my-module"); use Version.unknownVersion() during early development.
  2. If extending SimpleModule, pass name and version via super(name, version) so both are populated together.
  3. Add a unit test asserting module.version() != null and module.getModuleName() != null before the module reaches a mapper builder.

Example fix

// before
public class MyModule extends JacksonModule {
    @Override public String getModuleName() { return "MyModule"; }
    @Override public Version version() { return null; } // throws
}
// after
public class MyModule extends JacksonModule {
    @Override public String getModuleName() { return "MyModule"; }
    @Override public Version version() {
        return new Version(1, 0, 0, null, "com.example", "my-module");
    }
}
Defensive patterns

Strategy: validation

Validate before calling

JacksonModule module = new MyModule();
if (module.version() == null || module.getModuleName() == null) {
    throw new IllegalStateException("Module " + module.getClass().getName()
        + " must define both name and version before registration");
}
mapperBuilder.addModule(module);

Prevention

When it happens

Trigger: Calling mapperBuilder.addModule(module)/addModules(...) with a custom JacksonModule whose version() returns null. Also triggered transitively via module.getDependencies() when a dependency module returns a null version.

Common situations: Hand-rolled JacksonModule subclass where getModuleName() was overridden but version() was forgotten or left returning null; copy-pasted module skeleton; migration from a base class that previously supplied a default Version.

Related errors


AI-assisted analysis of FasterXML/jackson-databind@a50c7d2a1d (2026-08-06). Data as JSON: /api/errors/b43a00bcfaedfa61. Report an issue: GitHub.