FasterXML/jackson-databind · error · IllegalArgumentException
Module ( ) without defined name
Error message
Module ({}) without defined name What it means
Thrown by MapperBuilder._verifyModuleMetadata when a JacksonModule being added has getModuleName() returning null. Every module must declare a non-null name (alongside a version) so Jackson can register, de-duplicate, and report it; a null name breaks module identity and is rejected when the module or any of its dependencies is added.
Solutions
- Override getModuleName() in your JacksonModule to return a stable non-null String (typically the module's symbolic name).
- Prefer constructing SimpleModule with the (name, version) constructor which sets both fields, instead of subclassing JacksonModule directly.
- If the failing module is a dependency (getDependencies()), fix or exclude that dependency module.
Example fix
// before
public class MyModule extends JacksonModule {
@Override public Version version() { return PackageVersion.VERSION; }
// getModuleName() missing -> returns null
}
// after
public class MyModule extends JacksonModule {
@Override public String getModuleName() { return "MyModule"; }
@Override public Version version() { return PackageVersion.VERSION; }
} Defensive patterns
Strategy: validation
Validate before calling
JacksonModule module = ...;
if (module.getModuleName() == null || module.version() == null) {
throw new IllegalStateException("Module missing name/version: " + module.getClass());
}
builder.addModule(module); Prevention
- Always set both name and version when constructing SimpleModule.
- Override getModuleName() and version() together in custom JacksonModule subclasses.
- Add a unit test that builds a mapper with your module to catch missing metadata early.
When it happens
Trigger: Calling JsonMapper.builder().addModule(module) (or addModules / module dependency resolution) where module.getModuleName() == null. Triggered for the module itself and recursively for any module returned by getDependencies().
Common situations: Hand-writing a JacksonModule subclass and forgetting to override getModuleName(); porting a 2.x module where the name was set via the SimpleModule constructor but the new subclass drops it; a third-party/SPI-loaded module (ServiceLoader) that is incomplete.
Related errors
- Module ( ) without defined version
- Cannot pass null modifier
- Cannot pass null resolver
- Cannot pass null resolver
- Cannot use includeAs of
AI-assisted analysis of FasterXML/jackson-databind@87876ca5c0 (2026-08-11).
Data as JSON: /api/errors/8b389f41ec9b142b.
Report an issue: GitHub.
Appendix: source
Thrown at src/main/java/tools/jackson/databind/cfg/MapperBuilder.java:1136
}
private void _addDependency(JacksonModule module)
{
_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);View on GitHub (pinned to 87876ca5c0)