{"record":{"id":"925efd9a924bee45","repo":"pentaho/pentaho-kettle","slug":"error0014","errorCode":"ERROR0014","errorMessage":"WebServices.ERROR0014.urlNotSpecified","messagePattern":"WebServices\\.ERROR0014\\.urlNotSpecified","errorType":"exception","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/webservices/WebService.java","lineNumber":149,"sourceCode":"  public WebService( StepMeta aStepMeta, StepDataInterface aStepData, int value, TransMeta aTransMeta, Trans aTrans ) {\n    super( aStepMeta, aStepData, value, aTransMeta, aTrans );\n\n    // Reference date used to format hours\n    try {\n      dateRef = timeFormat.parse( \"00:00:00\" );\n    } catch ( ParseException e ) {\n      logError( \"Unexpected error in WebService constructor: \", e );\n      setErrors( 1 );\n      stopAll();\n    }\n  }\n\n  public boolean processRow( StepMetaInterface metaInterface, StepDataInterface dataInterface ) throws KettleException {\n    meta = (WebServiceMeta) metaInterface;\n\n    // if a URL is not specified, throw an exception\n    if ( Utils.isEmpty( meta.getUrl() ) ) {\n      throw new KettleStepException( BaseMessages.getString(\n        PKG, \"WebServices.ERROR0014.urlNotSpecified\", getStepname() ) );\n    }\n\n    // if an operation is not specified, throw an exception\n    if ( Utils.isEmpty( meta.getOperationName() ) ) {\n      throw new KettleStepException( BaseMessages.getString(\n        PKG, \"WebServices.ERROR0015.OperationNotSelected\", getStepname() ) );\n    }\n\n    data = (WebServiceData) dataInterface;\n    Object[] vCurrentRow = getRow();\n\n    if ( first ) {\n      first = false;\n\n      if ( getInputRowMeta() != null ) {\n        data.outputRowMeta = getInputRowMeta().clone();\n      } else {","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/webservices/WebService.java#L131-L167","documentation":"Thrown by the WebService (SOAP lookup) step's processRow() when the step's URL is empty or null. The step cannot issue a SOAP request without a target service URL, so it aborts immediately with a KettleStepException naming the step. This is a configuration validation check, not a runtime/network failure.","triggerScenarios":"Running a transformation where the WebService step meta has meta.getUrl() returning null/empty — i.e., no URL was entered in the step dialog or loaded from the transformation metadata.","commonSituations":"Transformation XML/kettle property not carrying the URL field after copy-paste between environments, variable-based URL (${SERVICE_URL}) left undefined, or a newly added step configured only partially.","solutions":["Open the WebService step dialog and set the URL field","If the URL uses a variable, define that variable (e.g. via kettle.properties or Set Variables) before execution","Check the saved transformation file/repo actually contains the URL attribute for the step"],"exampleFix":"// before\nString url = getVariable( \"SERVICE_URL\", \"\" ); // empty -> step fails\n// after\nString url = getVariable( \"SERVICE_URL\", \"\" );\nif ( Utils.isEmpty( url ) ) {\n  throw new KettleException( \"SERVICE_URL variable must be set before running the transformation\" );\n}","handlingStrategy":"validation","validationCode":"// validate meta before running the transformation\nWebServiceMeta meta = (WebServiceMeta) stepMeta.getStepMetaInterface();\nif ( meta.getUrl() == null || meta.getUrl().trim().isEmpty() ) {\n  throw new IllegalArgumentException( \"WebService step '\" + stepMeta.getName() + \"' has no URL configured\" );\n}","typeGuard":null,"tryCatchPattern":"try {\n  trans.execute( null );\n} catch ( KettleException e ) {\n  if ( e.getMessage() != null && e.getMessage().contains( \"ERROR0014\" ) ) {\n    logError( \"WebService step missing URL; fix step configuration\" );\n  }\n}","preventionTips":["Always fill the URL field in the step dialog before saving","Prefer literal or validated variable-based URLs and define variables in kettle.properties","Run the step's check() / verify transformation before scheduling","Version-control transformations and review step configs in code review"],"tags":["kettle","webservice","configuration","validation"],"backgroundTag":"empty-required-field","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"}