NeuroAgent

How to Pass 'Null' String to SOAP Web Service in ActionScript 3

Learn how to pass the string 'Null' to SOAP web services in ActionScript 3 without triggering MissingArgumentException. Complete guide with CDATA solutions and code examples.

Question

How to pass the string ‘Null’ to a SOAP web service in ActionScript 3 without triggering a MissingArgumentException error

We have an employee whose surname is ‘Null’, and our employee lookup application crashes when this surname is used as a search term. The error received is:

<soapenv:Fault>
   <faultcode>soapenv:Server.userException</faultcode>
   <faultstring>coldfusion.xml.rpc.CFCInvocationException: [coldfusion.runtime.MissingArgumentException : The SEARCHSTRING parameter to the getFacultyNames function is required but was not passed in.]</faultstring>
</soapenv:Fault>

The parameter type is defined as string. This issue occurs specifically when calling the web service from ActionScript 3, but not when calling it from a ColdFusion page.

Technical environment:

  • WSDL (SOAP)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

How can we properly pass the string ‘Null’ to the SOAP web service in ActionScript 3 without the system interpreting it as a null value?

NeuroAgent

When passing the string “Null” to a SOAP web service from ActionScript 3, the issue occurs because the system interprets the string as a null value rather than a literal string. To resolve this, you need to use CDATA sections in your SOAP request to prevent XML parsing from treating “Null” as a null value, or implement alternative workarounds like adding a space to the string or splitting it into multiple parameters. This issue is specific to ActionScript 3’s SOAP implementation and doesn’t occur in ColdFusion due to differences in how each language handles string serialization.

Contents

Understanding the Problem

The issue you’re experiencing is a classic problem in SOAP web service communication when dealing with string values that match reserved keywords like “null” or “Null”. When your ActionScript 3 application sends the surname “Null” to the ColdFusion web service, the SOAP request serializer is interpreting this as a null value rather than a literal string.

This behavior is specific to ActionScript 3 and Flex 3.5, as evidenced by the fact that the same call works correctly when made directly from ColdFusion. The difference lies in how each language handles the serialization of string values to XML format within SOAP envelopes.

The error message clearly indicates that the SEARCHSTRING parameter is not being passed at all:

<coldfusion.runtime.MissingArgumentException: The SEARCHSTRING parameter to the getFacultyNames function is required but was not passed in.>

This suggests that somewhere in the serialization process, the string “Null” is being converted to an actual null value, causing the web service to believe no parameter was provided.

Root Cause Analysis

The root cause of this issue stems from how ActionScript 3 and Flex handle XML serialization for SOAP requests. When ActionScript encounters the string “Null”, it appears that the underlying SOAP serialization logic is interpreting this as a null value rather than treating it as a literal string.

Several factors contribute to this behavior:

  1. XML Parsing Confusion: The XML parser in ActionScript 3 may be interpreting the string “Null” as an XML node representing a null value, especially when dealing with SOAP envelopes.

  2. Type Coercion Issues: ActionScript 3’s weak equality testing (==) can cause the XML containing “Null” to be coerced to the null type, or the null type to be coerced to an XML element containing the string “null” source.

  3. WSDL Generation Differences: The WSDL generated by ColdFusion 8 might not properly handle string literals that could be interpreted as null values when consumed by ActionScript 3 clients.

  4. SOAP Request Formatting: The way ActionScript 3 formats SOAP requests may differ from ColdFusion’s approach, leading to different interpretations of the same string value.

Understanding these root causes is essential because it helps explain why simple solutions like string validation or type conversion might not work in this specific scenario.

Solutions for Passing ‘Null’ String

Solution 1: Using CDATA Sections

The most reliable solution is to wrap your string parameter in a CDATA section within the SOAP request. This prevents the XML parser from interpreting “Null” as anything other than literal text.

actionscript
// Create the SOAP envelope with CDATA protection
var soapRequest:XML = <soapenv:Envelope>
    <soapenv:Header/>
    <soapenv:Body>
        <ns:getFacultyNames>
            <ns:SEARCHSTRING><![CDATA[Null]]></ns:SEARCHSTRING>
        </ns:getFacultyNames>
    </soapenv:Body>
</soapenv:Envelope>;

The CDATA section ensures that the string “Null” is treated as literal text and not interpreted as an XML element or null value source.

Solution 2: Adding a Space to the String

A simpler workaround is to modify the string slightly by adding a space, which prevents the system from interpreting it as a null value:

actionscript
var searchValue:String = "Null ";
// Or
var searchValue:String = "Null"; // Then add space before sending
searchValue += " ";

This works because the space character changes the string’s composition, making it no longer match the null interpretation pattern source.

Solution 3: Splitting the String into Multiple Parameters

If the web service allows for multiple parameters, you can split the “Null” string into separate parts:

actionscript
// Split "Null" into "Nu" and "ll" as separate parameters
var firstNamePart:String = "Nu";
var lastNamePart:String = "ll";

// Pass both parameters to the web service
var parameters:Object = {
    SEARCHSTRING1: firstNamePart,
    SEARCHSTRING2: lastNamePart
};

This approach works when there’s a minimum length requirement for the parameter, as you can reconstruct the original string on the server side source.

Solution 4: Using Strict Equality Testing

Modify your ActionScript code to use strict equality testing (===) when checking for null values:

actionscript
// Use strict equality instead of weak equality
if (searchString === null) {
    // Handle actual null case
} else {
    // Process the string normally
}

This prevents the coercion issues where “Null” might be interpreted as null source.

Solution 5: Custom SOAP Request Construction

Instead of relying on the generated web service stubs, construct your SOAP request manually:

actionscript
import mx.rpc.soap.WebService;
import mx.rpc.soap.Operation;

var ws:WebService = new WebService("your-wsdl-url");
var operation:Operation = ws.getOperation("getFacultyNames");

// Override the request generation
operation.request = function(searchString:String):void {
    var envelope:XML = 
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                         xmlns:ns="your-namespace">
            <soapenv:Header/>
            <soapenv:Body>
                <ns:getFacultyNames>
                    <ns:SEARCHSTRING>{searchString}</ns:SEARCHSTRING>
                </ns:getFacultyNames>
            </soapenv:Body>
        </soapenv:Envelope>;
    
    // Manually handle the XML to prevent null interpretation
    if (searchString == "Null") {
        envelope..SEARCHSTRING.setChildren("<![CDATA[" + searchString + "]]>");
    }
    
    return envelope;
};

// Call the operation
ws.getFacultyNames("Null");

This gives you full control over how the SOAP request is constructed.

Implementation Examples

Complete CDATA Solution Example

Here’s a complete implementation using the CDATA approach:

actionscript
import mx.rpc.soap.WebService;
import mx.rpc.soap.Operation;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;

public class EmployeeLookupService {
    private var webService:WebService;
    
    public function EmployeeLookupService() {
        webService = new WebService("http://your-server/your-cfc?wsdl");
        webService.loadWSDL();
    }
    
    public function searchBySurname(surname:String):void {
        // Override the default request handling for "Null" surname
        var operation:Operation = webService.getOperation("getFacultyNames");
        
        operation.addEventListener(ResultEvent.RESULT, onResult);
        operation.addEventListener(FaultEvent.FAULT, onFault);
        
        // Create custom request envelope
        var envelope:XML = createSoapEnvelope(surname);
        operation.send(envelope);
    }
    
    private function createSoapEnvelope(surname:String):XML {
        var namespace:String = "http://your-namespace.com/";
        
        // Use CDATA for the surname to prevent null interpretation
        var surnameNode:XML = <SEARCHSTRING>{surname}</SEARCHSTRING>;
        if (surname == "Null") {
            surnameNode.setChildren("<![CDATA[" + surname + "]]>");
        }
        
        return <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                xmlns:ns={namespace}>
                  <soapenv:Header/>
                  <soapenv:Body>
                      <ns:getFacultyNames>
                          {surnameNode}
                      </ns:getFacultyNames>
                  </soapenv:Body>
               </soapenv:Envelope>;
    }
    
    private function onResult(event:ResultEvent):void {
        // Handle successful result
        trace("Search results: " + event.result);
    }
    
    private function onFault(event:FaultEvent):void {
        // Handle error
        trace("Service error: " + event.fault.faultString);
    }
}

Using the Space Addition Method

actionscript
public function searchBySurnameWithSpaceFix(surname:String):void {
    // Add space to prevent null interpretation
    var fixedSurname:String = surname;
    if (surname == "Null") {
        fixedSurname += " ";
    }
    
    var ws:WebService = new WebService("http://your-server/your-cfc?wsdl");
    ws.getFacultyNames.addEventListener(ResultEvent.RESULT, onResult);
    ws.getFacultyNames.addEventListener(FaultEvent.FAULT, onFault);
    
    // Pass the modified surname
    ws.getFacultyNames(fixedSurname);
}

String Splitting Implementation

actionscript
public function searchBySurnameWithSplitting(surname:String):void {
    var ws:WebService = new WebService("http://your-server/your-cfc?wsdl");
    
    if (surname.length > 3 && surname == "Null") {
        // Split "Null" into parts
        var part1:String = surname.substring(0, 2); // "Nu"
        var part2:String = surname.substring(2);    // "ll"
        
        // Call with split parameters
        ws.getFacultyNamesSplit(part1, part2);
    } else {
        // Normal call for other surnames
        ws.getFacultyNames(surname);
    }
}

Best Practices and Recommendations

1. Use CDATA Sections for Reliability

The CDATA approach is the most reliable solution because it explicitly tells the XML parser to treat the content as literal text rather than markup. This method works consistently across different SOAP implementations and is less likely to break with future updates.

2. Implement Server-Side Validation

Even if you solve the client-side issue, it’s good practice to implement server-side validation:

coldfusion
<cffunction name="getFacultyNames" access="remote" returntype="array">
    <cfargument name="searchString" type="string" required="true">
    
    <!--- Log the actual received value for debugging --->
    <cflog text="Received searchString: '#arguments.searchString#' type: '#(arguments.searchString.getClass().getName())#'">
    
    <!--- Handle the special case --->
    <cfif arguments.searchString eq "Null">
        <!--- Process as literal "Null" string --->
        <cfset var faculty = queryExecute("SELECT * FROM faculty WHERE surname = ?", ["Null"])>
    <cfelse>
        <!--- Normal processing --->
        <cfset var faculty = queryExecute("SELECT * FROM faculty WHERE surname LIKE ?", ["#arguments.searchString#%"])>
    </cfif>
    
    <cfreturn faculty>
</cffunction>

3. Consider WSDL Modifications

If you have control over the WSDL, consider modifying the data type definition:

xml
<xs:element name="searchString" type="xs:string">
    <xs:annotation>
        <xs:documentation>Special handling required for string "Null"</xs:documentation>
    </xs:annotation>
</xs:element>

4. Implement Comprehensive Error Handling

actionscript
public function searchWithFallback(surname:String):void {
    try {
        // Try CDATA approach first
        searchBySurnameWithCDATA(surname);
    } catch (e:Error) {
        // Fallback to space addition method
        try {
            searchBySurnameWithSpaceFix(surname);
        } catch (e2:Error) {
            // Final fallback to string splitting
            searchBySurnameWithSplitting(surname);
        }
    }
}

5. Document the Special Case

Make sure to document this special case in your code and technical documentation:

actionscript
/**
 * Handles employee surname search with special consideration for "Null" surname.
 * Due to ActionScript 3 SOAP serialization issues, the string "Null" is interpreted
 * as a null value, causing MissingArgumentException. This method implements
 * CDATA protection to resolve the issue.
 * 
 * @param surname The employee surname to search for
 * @throws Error If the web service call fails
 */
public function searchEmployeeBySurname(surname:String):void {
    // Implementation with CDATA protection
}

6. Testing Strategy

Create comprehensive test cases to verify all solutions:

actionscript
public function testAllSolutions():void {
    var testCases:Array = [
        "Null",      // The problematic case
        "null",      // Lowercase null
        "NULL",      // Uppercase NULL
        "NotNull",   // Similar but different
        " ",         // Empty with space
        "",          // Truly empty
        null         // Actual null
    ];
    
    for each (var testCase:String in testCases) {
        trace("Testing: " + testCase);
        searchWithFallback(testCase);
    }
}

Conclusion

Successfully passing the string “Null” to a SOAP web service from ActionScript 3 requires understanding the XML serialization nuances that cause this specific interpretation issue. The most reliable solution is using CDATA sections in your SOAP envelope to prevent the XML parser from treating “Null” as a null value. Alternative approaches like adding a space to the string or splitting it into multiple parameters can also work but may be less robust.

Key takeaways include:

  • Always use CDATA sections for string values that could be interpreted as reserved keywords
  • Implement proper error handling and fallback mechanisms
  • Consider server-side validation and logging for debugging
  • Document special cases in your codebase
  • Test comprehensively with edge cases

By implementing these solutions, you can ensure that the surname “Null” is properly handled in your employee lookup application without triggering the MissingArgumentException error. This approach maintains system reliability while accommodating real-world data scenarios where string values might coincide with technical keywords.

Sources

  1. Stack Overflow - How to pass “Null” (a real surname!) to a SOAP web service in ActionScript 3
  2. Experts Exchange - Value cannot be null. Parameter name s error after successful web service call
  3. TempMail - How to Use ActionScript 3 to Handle Null Surname in SOAP
  4. Medium - Managing Null Values in SOAP Requests with Apache Flex ActionScript 3
  5. Quora - How to pass the string literal “Null” to a SOAP web service in ActionScript 3