pentaho/pentaho-kettle · error · KettleException
RepositoryLogin.ErrorLoginToRepository
Error message
RepositoryLogin.ErrorLoginToRepository
What it means
loginToRepository() only performs repository.init/repository.connect when a repositoryMeta and repository are available; otherwise it logs and throws KettleException 'RepositoryLogin.ErrorLoginToRepository'. The else-branch means the login was attempted without a resolved repository object, so no connection could even be tried.
Solutions
- Ensure a repository is selected and RepositoriesHelper.getRepository()/repositoryMeta is non-null before calling loginToRepository().
- Call fillRepositories()/resolveRepositoryMeta first so the repository object is constructed.
- If connect() itself fails, check the repository server/DB is reachable and credentials are correct — this error means no repository object existed, not bad credentials.
Example fix
// before
helper.loginToRepository( model );
// after
if ( helper.getRepository() == null || model.getSelectedRepositoryMeta() == null ) {
showErrorDialog( "Select a repository before logging in" );
return;
}
helper.loginToRepository( model ); Defensive patterns
Strategy: validation
Validate before calling
if ( model.getSelectedRepository() == null ) {
throw new IllegalStateException( "No repository selected before login" );
}
if ( helper.getRepository() == null ) {
helper.fillRepositories(); // resolve repositoryMeta and construct the Repository object first
} Try / catch
try {
helper.loginToRepository( model );
} catch ( KettleException e ) {
if ( e.getMessage().contains( "ErrorLoginToRepository" ) ) {
showError( "No repository was resolved for login. Select a repository first." );
} else {
throw e;
}
} Prevention
- Disable the login button until a repository row is selected in the repositories list.
- Call fillRepositories() before loginToRepository() so repositoryMeta/repository are populated.
- Validate repositories.xml content at startup; drop entries that cannot be resolved.
- Distinguish 'no repository object' from 'wrong credentials' in error handling.
When it happens
Trigger: Calling loginToRepository() when the selected repository metadata was never resolved into a Repository object (e.g. getRepository() returned null because repositoryMeta was null or the connect branch was not entered).
Common situations: User clicks login before a repository is selected; repositories.xml missing the selected entry so repositoryMeta is null; plugin lookup failed earlier leaving repository unset; race between dialog fill and login button.
Understand the failure class
Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.
Related errors
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/7ad4960f03aa6f14.
Report an issue: GitHub.
Appendix: source
Thrown at ui/src/main/java/org/pentaho/di/ui/repository/RepositoriesHelper.java:266
public void setPreferredRepositoryName( String repname ) {
prefRepositoryName = repname;
}
public void loginToRepository() throws KettleException, KettleSecurityException {
if ( model != null && model.getSelectedRepository() != null ) {
RepositoryMeta repositoryMeta =
input.getRepository( model.getRepositoryIndex( model.getSelectedRepository() ) );
repository =
PluginRegistry.getInstance().loadClass(
RepositoryPluginType.class, repositoryMeta.getId(), Repository.class );
repository.init( repositoryMeta );
repository.connect( model.getUsername(), model.getPassword() );
props.setLastRepository( repositoryMeta.getName() );
props.setLastRepositoryLogin( model.getUsername() );
} else {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorLoginToRepository" ) );
throw new KettleException( BaseMessages.getString( PKG, "RepositoryLogin.ErrorLoginToRepository" ) );
}
}
public void updateShowDialogOnStartup( boolean value ) {
props.setRepositoriesDialogAtStartupShown( value );
}
private void writeData() {
try {
input.writeData();
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorSavingRepositoryDefinition", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorSavingRepositoryDefinition", e.getLocalizedMessage() ), e );
}
}
}View on GitHub (pinned to f3058517a1)