Temos um funcionário cujo sobrenome é Nulo. Nosso aplicativo de pesquisa de funcionários é eliminado quando esse sobrenome é usado como o termo de pesquisa (que acontece com bastante frequência agora). O erro recebido (obrigado Fiddler!) É:
<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>
Bonitinho, hein?
O tipo de parâmetro é string
.
Estou usando:
Observe que o erro não ocorre ao chamar o serviço da web como um objeto de uma página do ColdFusion.
Respostas:
Rastreando-o
No começo, pensei que era um bug de coerção para o qual
null
estava sendo coagido"null"
e um teste"null" == null
estava passando. Não é. Eu estava perto, mas muito, muito errado. Me desculpe por isso!Desde então, fiz muitas brincadeiras no wonderfl.net e rastreio o código em
mx.rpc.xml.*
. Na linha 1795 deXMLEncoder
(na fonte 3.5), emsetValue
, todo o XMLEncoding se resume aque é essencialmente o mesmo que:
Este código, de acordo com o meu violino original, retorna um elemento XML vazio. Mas por que?
Causa
De acordo com o comentarista Justin Mclean no relatório de bug FLEX-33664 , o culpado a seguir (veja os dois últimos testes no meu violino que verificam isso):
Quando
currentChild.appendChild
a cadeia é passada"null"
, ela primeiro a converte em um elemento XML raiz com textonull
e depois testa esse elemento em relação ao literal nulo. Este é um teste de igualdade fraco, portanto, o XML que contém nulo é coagido para o tipo nulo ou o tipo nulo é coagido para um elemento xml raiz que contém a cadeia "nula" e o teste passa onde provavelmente deve falhar. Uma correção pode ser sempre usar testes rigorosos de igualdade ao verificar XML (ou qualquer coisa, na verdade) para "nulidade".Solução
A única solução razoável que posso pensar, além de corrigir esse bug em todas as malditas versões do ActionScript, é testar campos "nulos" e escapar deles como valores CDATA .Os valores CDATA são a maneira mais apropriada de alterar um valor de texto inteiro que, de outra forma, causaria problemas de codificação / decodificação. A codificação hexadecimal, por exemplo, destina-se a caracteres individuais. Os valores CDATA são preferidos quando você está escapando do texto inteiro de um elemento. A maior razão para isso é que mantém a legibilidade humana.
fonte
Na nota xkcd , o site Bobby Tables oferece bons conselhos para evitar a interpretação incorreta dos dados do usuário (neste caso, a cadeia "Nulo") nas consultas SQL em vários idiomas, incluindo o ColdFusion .
Não está claro pela pergunta que essa é a fonte do problema e, dada a solução mencionada em um comentário à primeira resposta (incorporando os parâmetros em uma estrutura), parece provável que fosse outra coisa.
fonte
O problema pode estar no codificador SOAP do Flex. Tente estender o codificador SOAP em seu aplicativo Flex e depure o programa para ver como o valor nulo é tratado.
Meu palpite é que passou como NaN (não é um número). Isso atrapalhará o processo de remoção da mensagem SOAP em algum momento (principalmente no servidor JBoss 5 ...). Lembro-me de estender o codificador SOAP e executar uma verificação explícita de como o NaN é tratado.
fonte
@ 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:(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:
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.
A saída de rastreio é:
fonte
content
está a string"null"
e "null" == null retorna false, para que o teste se comporte conforme o pretendido. Em vez disso, acredito que o problema é uma mistura de como o XML.appendChild lida com um argumento de string e como um elemento XML raiz contendo apenas a string "null" pode ser coagido a um literalnull
.true
é o comportamento desejado aqui. Se o contrário acontecesse, isso descartaria a string "null" do processo de codificação, que de fato seria a causa do problema. No entanto, como esse teste é bem-sucedido, o codificador continua, até que XML.appendChild o descarte devido a um bug de coerção.var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s);
ao seu exemplo de código.Converta todos os caracteres em seus equivalentes de entidade hexadecimal. Nesse caso,
Null
seria convertido emE;KC;C;
fonte
A string de um
null
valor no ActionScript fornecerá a string"NULL"
. Minha suspeita é que alguém decidiu que ele é, portanto, uma boa idéia para decodificar a seqüência"NULL"
comonull
, causando a ruptura que você vê aqui - provavelmente porque eles estavam passando emnull
objetos e recebendo cordas no banco de dados, quando eles não queriam isso (portanto, verifique também esse tipo de bug).fonte
Como um hack, você pode considerar um tratamento especial no lado do cliente, convertendo a string 'Null' em algo que nunca ocorrerá, por exemplo, XXNULLXX e convertendo novamente no servidor.
Não é bonito, mas pode resolver o problema de um caso de fronteira.
fonte
Null
?Bem, acho que a implementação do codificador SOAP pelo Flex parece serializar valores nulos incorretamente. Serializá-los como um String Null não parece ser uma boa solução. A versão formalmente correta parece passar um valor nulo como:
Portanto, o valor de "Null" não seria nada além de uma sequência válida, que é exatamente o que você está procurando.
Eu acho que consertar isso no Apache Flex não deve ser tão difícil de fazer. Eu recomendaria abrir um problema com o Jira ou entrar em contato com os caras da lista de discussão apache-flex. No entanto, isso iria corrigir apenas o lado do cliente. Não sei dizer se o ColdFusion será capaz de trabalhar com valores nulos codificados dessa maneira.
Consulte também a postagem no blog de Radu Cotescu Como enviar valores nulos em solicitações soapUI .
fonte
null
valor verdadeiro corretamente, configurandoxsi:nil="true"
o elemento Na verdade, o problema parece estar na maneira como oXML
próprio tipo do ActionScript (não o codificador) lida com a string"null"
.É um erro, mas supondo que exista um comprimento mínimo para
SEARCHSTRING
, por exemplo, 2 caracteres,substring
oSEARCHSTRING
parâmetro no segundo caractere e passe-o como dois parâmetros:SEARCHSTRING1 ("Nu")
eSEARCHSTRING2 ("ll").
Concatenate
eles se juntam novamente ao executar a consulta no banco de dados.fonte
n
,u
,l
têm uma semântica especial em XML. "NULL" e "<! [CDATA [NULL]]>>" são idênticos a um analisador XML.NULL
, mas ser pedante<blah>null</blah>
e<blah><![CDATA[null]]>
não ser o mesmo para um analisador XML. Eles devem produzir os mesmos resultados, no entanto, o fluxo lógico para manipulá-los é diferente. É esse efeito que estamos explorando como uma solução alternativa para o bug na implementação do XML flexível. Defendo isso em detrimento de outras abordagens, pois preserva a legibilidade do texto e não tem efeitos colaterais para outros analisadores.