@ doc_180 tenía el concepto correcto, excepto que está enfocado en los números, mientras que el póster original tenía problemas con las cadenas.
La solución es cambiar el mx.rpc.xml.XMLEncoder
archivo. Esta es la línea 121:
if (content != null)
result += content;
(Miré el SDK de Flex 4.5.1; los números de línea pueden diferir en otras versiones).
Básicamente, la validación falla porque 'el contenido es nulo' y, por lo tanto, su argumento no se agrega al paquete SOAP saliente; causando así el error de parámetro faltante.
Tiene que extender esta clase para eliminar la validación. Luego hay una gran bola de nieve en la cadena, modificando SOAPEncoder para usar su XMLEncoder modificado, y luego modificando Operation para usar su SOAPEncoder modificado, y luego moidfying WebService para usar su clase de Operación alternativa.
Pasé unas horas en eso, pero necesito seguir adelante. Probablemente tomará uno o dos días.
Es posible que pueda arreglar la línea XMLEncoder y hacer algunos parches de mono para usar su propia clase.
También agregaré que si cambia a usar RemoteObject / AMF con ColdFusion, el valor nulo se pasa sin problemas.
11/16/2013 actualización :
Tengo una adición más reciente a mi último comentario sobre RemoteObject / AMF. Si está utilizando ColdFusion 10; entonces las propiedades con un valor nulo en un objeto se eliminan del objeto del lado del servidor. Por lo tanto, debe verificar la existencia de propiedades antes de acceder a ella o obtendrá un error de tiempo de ejecución.
Comprueba así:
<cfif (structKeyExists(arguments.myObject,'propertyName')>
<!--- no property code --->
<cfelse>
<!--- handle property normally --->
</cfif>
Este es un cambio de comportamiento de ColdFusion 9; donde las propiedades nulas se convertirían en cadenas vacías.
Editar 06/12/2013
Como había una pregunta sobre cómo se tratan los nulos, aquí hay una aplicación de muestra rápida para demostrar cómo una cadena "nulo" se relacionará con la palabra reservada nulo.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" initialize="application1_initializeHandler(event)">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
protected function application1_initializeHandler(event:FlexEvent):void
{
var s :String = "null";
if(s != null){
trace('null string is not equal to null reserved word using the != condition');
} else {
trace('null string is equal to null reserved word using the != condition');
}
if(s == null){
trace('null string is equal to null reserved word using the == condition');
} else {
trace('null string is not equal to null reserved word using the == condition');
}
if(s === null){
trace('null string is equal to null reserved word using the === condition');
} else {
trace('null string is not equal to null reserved word using the === condition');
}
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
</s:Application>
La salida de rastreo es:
la cadena nula no es igual a la palabra reservada nula usando la condición! =
la cadena nula no es igual a la palabra reservada nula usando la condición ==
la cadena nula no es igual a la palabra reservada nula usando la condición ===