pentaho/pentaho-kettle · error · KettleException
No Factory found for
Error message
No Factory found for <managerClass>
What it means
BaseBowl.getManager() lazily creates manager instances by looking up a ManagerFactory in the BowlManagerFactoryRegistry. If no factory is registered for the requested manager class, it throws this KettleException. This means the manager type was never registered with the registry (typically at plugin or environment initialization).
Solutions
- Ensure the plugin/initializer that calls BowlManagerFactoryRegistry.getInstance().register(...) runs before getManager
- Verify the plugin JAR providing the manager factory is on the classpath / installed
- Initialize the Kettle environment (e.g. KettleEnvironment.init()) before using bowls
- Catch KettleException and fall back to a default manager or report a clear config error
Example fix
// before Bowl bowl = ...; bowl.getManager(MyManager.class); // factory never registered // after BowlManagerFactoryRegistry.getInstance().register(MyManager.class, new MyManagerFactory()); bowl.getManager(MyManager.class);
Defensive patterns
Strategy: try-catch
Validate before calling
ManagerFactory<MyManager> f = BowlManagerFactoryRegistry.getInstance().getManagerFactory(MyManager.class);
if (f == null) {
throw new IllegalStateException("MyManager factory not registered; ensure the owning plugin is loaded");
} Try / catch
try {
MyManager m = bowl.getManager(MyManager.class);
} catch (KettleException e) {
if (e.getMessage().startsWith("No Factory found")) {
log.error("Manager factory missing — plugin not registered/loaded: " + e.getMessage(), e);
} else throw e;
} Prevention
- Initialize KettleEnvironment (and plugin registry) before calling getManager
- Verify the plugin providing the factory is installed/on the classpath
- Register factories early in application bootstrap, before any bowl usage
- Document which manager classes require which plugins
When it happens
Trigger: Calling bowl.getManager(SomeManager.class) where SomeManager's factory was never registered via BowlManagerFactoryRegistry — e.g. the responsible plugin isn't loaded, or registration code didn't run before the lookup.
Common situations: Using a bowl in a standalone/embedded Kettle context where plugin lifecycle/registration never ran; ordering bugs where getManager is called before factory registration; missing plugin JAR on the classpath; version changes in manager classes.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- Unable to create manager for
- A connection of type PALO is expected
- A connection of type PALO is expected
- A deadlock was detected between steps
- A server socket allocation always has to accompanied by a…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/a7c227eea7b9ab88.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/org/pentaho/di/core/bowl/BaseBowl.java:39
public abstract class BaseBowl implements Bowl {
private final Map<Class<?>, Object> managerInstances = new ConcurrentHashMap<>();
private final Set<Bowl> parentBowls = ConcurrentHashMap.newKeySet();
@Override
public <T> T getManager( Class<T> managerClass ) throws KettleException {
// can't use computeIfAbsent here because we want exceptions to propagate. :(
T result = managerClass.cast( managerInstances.get( managerClass ) );
if ( result != null ) {
return result;
}
synchronized ( this ) {
result = managerClass.cast( managerInstances.get( managerClass ) );
if ( result == null ) {
ManagerFactory<T> factory = BowlManagerFactoryRegistry.getInstance().getManagerFactory( managerClass );
if ( factory == null ) {
throw new KettleException( "No Factory found for " + managerClass );
}
result = factory.apply( this );
if ( result == null ) {
throw new KettleException( "Unable to create manager for " + managerClass );
}
managerInstances.put( managerClass, result );
}
return result;
}
}
@Override
public Set<Bowl> getParentBowls() {
return parentBowls;
}
public void addParentBowl( Bowl parent ) {
parentBowls.add( parent );View on GitHub (pinned to f3058517a1)