{"record":{"id":"c8f6ba01da036067","repo":"pentaho/pentaho-kettle","slug":"javascript-conversion-to-bignumber-not-implemented-for","errorCode":null,"errorMessage":"JavaScript conversion to BigNumber not implemented for ${classType}","messagePattern":"JavaScript conversion to BigNumber not implemented for (.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/core/util/JavaScriptUtils.java","lineNumber":191,"sourceCode":"      Number nb = Context.toNumber( value );\n      return BigDecimal.valueOf( nb.doubleValue() );\n    } else if ( classType.equalsIgnoreCase( JS_NATIVE_JAVA_OBJ ) ) {\n      // Is it a BigDecimal class ?\n      return convertNativeJavaToBigDecimal( value );\n    } else if ( classType.equalsIgnoreCase( \"java.lang.Byte\" ) ) {\n      return BigDecimal.valueOf( ( (Byte) value ).longValue() );\n    } else if ( classType.equalsIgnoreCase( \"java.lang.Short\" ) ) {\n      return BigDecimal.valueOf( ( (Short) value ).longValue() );\n    } else if ( classType.equalsIgnoreCase( \"java.lang.Integer\" ) ) {\n      return BigDecimal.valueOf( ( (Integer) value ).longValue() );\n    } else if ( classType.equalsIgnoreCase( \"java.lang.Long\" ) ) {\n      return BigDecimal.valueOf( ( (Long) value ).longValue() );\n    } else if ( classType.equalsIgnoreCase( \"java.lang.Double\" ) ) {\n      return BigDecimal.valueOf( ( (Double) value ).doubleValue() );\n    } else if ( classType.equalsIgnoreCase( \"java.lang.String\" ) ) {\n      return BigDecimal.valueOf( ( new Long( (String) value ) ).longValue() );\n    } else {\n      throw new UnsupportedOperationException( \"JavaScript conversion to BigNumber not implemented for \" + classType );\n    }\n  }\n\n  private static BigDecimal convertNativeJavaToBigDecimal( Object value ) {\n    try {\n      return (BigDecimal) Context.jsToJava( value, BigDecimal.class );\n    } catch ( Exception e ) {\n      try {\n        Value v = (Value) Context.jsToJava( value, Value.class );\n        if ( !v.isNull() ) {\n          return v.getBigNumber();\n        } else {\n          return null;\n        }\n      } catch ( Exception e2 ) {\n        String string = (String) Context.jsToJava( value, String.class );\n        return new BigDecimal( string );\n      }","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/core/util/JavaScriptUtils.java#L173-L209","documentation":"jsToBigNumber() converts a JS value to a BigDecimal only when the classType is java.lang.Long, java.lang.Double, or java.lang.String. Any other declared classType falls through to UnsupportedOperationException with this message. It is an unimplemented conversion path in JavaScriptUtils.","triggerScenarios":"convertFromJs routes a value to jsToBigNumber for a BigNumber output field whose value's runtime classType string is none of the handled types (e.g. java.lang.Integer, java.lang.BigDecimal, java.lang.Boolean, or a JS-native wrapper reported differently).","commonSituations":"Script returns an Integer/Boolean/Date while the output field is BigNumber; value passed through JS code changes its native Java class from what the metadata expects; newer Pentaho/JS engine reports wrapper types not covered by the if-chain.","solutions":["Cast or coerce the script result to a Number or String before output (e.g. use Number(value) or value.toString()).","Change the output field type to Number/String to match the actual value class, then convert downstream.","Normalize the value in JavaScript so its Java class is java.lang.Long, java.lang.Double, or java.lang.String."],"exampleFix":"// before\nvar result = new java.lang.Integer(42); // Integer unsupported for BigNumber\n// after\nvar result = new java.lang.Long(42); // or Number(42) / \"42\"","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"function isBigNumberCompatible(v) {\n  var c = v != null ? v.getClass().getName() : null;\n  return c === \"java.lang.Long\" || c === \"java.lang.Double\" || c === \"java.lang.String\";\n}","tryCatchPattern":"try {\n  Object result = JavaScriptUtils.convertFromJs(context, value, fieldName, classType);\n} catch (UnsupportedOperationException e) {\n  // coerce to String and retry, or change field type to Number\n}","preventionTips":["Return plain numbers or Long/Double objects from scripts feeding BigNumber fields.","Avoid Integer/Boolean/Date values on BigNumber output fields.","Match the script's returned Java class to the declared field metadata."],"tags":["javascript","type-conversion","unsupported","bignumber"],"backgroundTag":"unsupported-operation","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}