@ doc_180 tinha o conceito certo, exceto que ele se concentra nos números, enquanto o pôster original teve problemas com as strings.
A solução é alterar o mx.rpc.xml.XMLEncoder
arquivo. Esta é a linha 121:
if (content != null)
result += content;
(Consultei o Flex 4.5.1 SDK; os números de linha podem diferir em outras versões.)
Basicamente, a validação falha porque 'o conteúdo é nulo' e, portanto, seu argumento não é adicionado ao pacote SOAP de saída; causando assim o erro de parâmetro ausente.
Você precisa estender essa classe para remover a validação. Em seguida, há uma grande bola de neve na cadeia, modificando o SOAPEncoder para usar o XMLEncoder modificado e, em seguida, a Operation para usar o SOAPEncoder modificado e, em seguida, instalando o WebService para usar sua classe de operação alternativa.
Passei algumas horas nisso, mas preciso seguir em frente. Provavelmente vai demorar um dia ou dois.
Você pode consertar apenas a linha XMLEncoder e fazer algumas correções de macacos para usar sua própria classe.
Também acrescentarei que, se você mudar para o RemoteObject / AMF com ColdFusion, o nulo será passado sem problemas.
16/11/2013 atualização :
Tenho uma adição mais recente ao meu último comentário sobre o RemoteObject / AMF. Se você estiver usando o ColdFusion 10; as propriedades com um valor nulo em um objeto são removidas do objeto do lado do servidor. Portanto, você deve verificar a existência das propriedades antes de acessá-las ou obterá um erro de tempo de execução.
Verifique assim:
<cfif (structKeyExists(arguments.myObject,'propertyName')>
<!--- no property code --->
<cfelse>
<!--- handle property normally --->
</cfif>
Esta é uma mudança de comportamento do ColdFusion 9; onde as propriedades nulas se transformariam em cadeias vazias.
Editar 06/12/2013
Como houve uma pergunta sobre como os nulos são tratados, aqui está um aplicativo de amostra rápida para demonstrar como uma sequência "nula" se relacionará com a palavra reservada nula.
<?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>
A saída de rastreio é:
cadeia nula não é igual a palavra reservada nula usando a condição! =
cadeia nula não é igual a palavra reservada nula usando a condição ==
cadeia nula não é igual a palavra reservada nula usando a condição ===