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
- 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.
- If extending SimpleModule, pass name and version via super(name, version) so both are populated together.
- 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
- Always override both getModuleName() and version() together in custom modules.
- Prefer extending SimpleModule and passing name+version to super(...) over raw JacksonModule.
- Assert module.version() != null in a unit test before wiring the module.
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
- Cannot pass null Deserializers
- Cannot pass null KeyDeserializers
- Cannot pass null modifier
- Cannot pass null resolver
- Module ({}) without defined name
AI-assisted analysis of FasterXML/jackson-databind@a50c7d2a1d (2026-08-06).
Data as JSON: /api/errors/b43a00bcfaedfa61.
Report an issue: GitHub.