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

  1. Ensure the plugin/initializer that calls BowlManagerFactoryRegistry.getInstance().register(...) runs before getManager
  2. Verify the plugin JAR providing the manager factory is on the classpath / installed
  3. Initialize the Kettle environment (e.g. KettleEnvironment.init()) before using bowls
  4. 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

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


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)