pentaho/pentaho-kettle · error · org.pentaho.di.core.exception.KettleValueException

KettleValueException with no message (rethrow of…

Error message

KettleValueException with no message (rethrow of KettleFileNotFoundException from deprecated loadFileContentInBinary)

What it means

This deprecated overload of loadFileContentInBinary catches the KettleFileNotFoundException thrown by the full version and rethrows it as a bare new KettleValueException() with NO message or cause. The original filename and reason are lost, making this error notoriously opaque.

Solutions

  1. Switch to the 4-arg overload loadFileContentInBinary(bowl, metaA, dataA, failIfNoFile) which propagates the real exception
  2. Pre-check file existence and skip the call when the file is missing
  3. Call the newer non-deprecated API so KettleFileNotFoundException with the path is preserved
  4. Log the input filename before the call to recover which file failed

Example fix

// before
Object content = ValueDataUtil.loadFileContentInBinary(bowl, metaA, dataA); // throws empty KettleValueException
// after
Object content = ValueDataUtil.loadFileContentInBinary(bowl, metaA, dataA, true); // preserves KettleFileNotFoundException
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: pre-check file existence via the value's filename
String filename = metaA.getString(dataA);
FileObject f = KettleVFS.getFileObject(filename);
if (f == null || !f.exists()) {
  throw new FileNotFoundException("Binary content file missing: " + filename);
}

Try / catch

try {
  content = ValueDataUtil.loadFileContentInBinary(bowl, metaA, dataA);
} catch (KettleValueException e) {
  // message-less by design; check the filename yourself
  log.error("Binary file load failed for: " + metaA.getString(dataA));
  throw e;
}

Prevention

When it happens

Trigger: Calling ValueDataUtil.loadFileContentInBinary(bowl, metaA, dataA) where the file named in dataA does not exist — the inner call's KettleFileNotFoundException is swallowed and replaced by a message-less KettleValueException.

Common situations: Legacy transformations using the binary file content calculator on a missing/unmounted file; paths valid on dev machine but absent in production.

Understand the failure class

Background: "is deprecated and will be removed" — deprecation warnings for old API names, keywords, and options, and how to migrate before the removal release — this error's family across 29 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/820576b1f2763e24. Report an issue: GitHub.

Appendix: source

Thrown at core/src/main/java/org/pentaho/di/core/row/ValueDataUtil.java:674

    }
    if ( dataA != null && dataB == null ) {
      return dataA;
    }

    return plus( metaA, dataA, metaB, dataB );
  }

  /**
   * @deprecated Use {@link ValueDataUtil#loadFileContentInBinary(ValueMetaInterface, Object, boolean)} instead
   */
  @Deprecated
  public static Object loadFileContentInBinary( Bowl bowl, ValueMetaInterface metaA, Object dataA )
    throws KettleValueException {
    Object content = null;
    try {
      content = loadFileContentInBinary( bowl, metaA, dataA, true );
    } catch ( KettleFileNotFoundException e ) {
      throw new KettleValueException();
    }
    return content;
  }

  /**
   *
   * @param metaA
   *   The ValueMetaInterface
   * @param dataA
   *   Filename
   * @param failIfNoFile
   *   Indicates if the transformation should fail if no file is found
   * @return File's content in binary
   * @throws KettleValueException
   * @throws KettleFileNotFoundException
   */
  public static byte[] loadFileContentInBinary( Bowl bowl, ValueMetaInterface metaA, Object dataA,
    boolean failIfNoFile ) throws KettleValueException, KettleFileNotFoundException {

View on GitHub (pinned to f3058517a1)