[flex] Как передать «Null» (настоящую фамилию!) На веб-службу SOAP в ActionScript 3?



Answers

В примечании xkcd на веб-сайте Bobby Tables есть полезные советы, чтобы избежать неправильной интерпретации пользовательских данных (в данном случае строки «Null») в SQL-запросах на разных языках, включая ColdFusion .

Из вопроса не ясно, что это источник проблемы, и учитывая решение, указанное в комментарии к первому ответу (вложение параметров в структуру), кажется вероятным, что это было нечто другое.

Question

У нас есть сотрудник, чья фамилия Null. Приложение для поиска сотрудников убивается, когда эта фамилия используется в качестве условия поиска (что часто случается довольно часто). Полученная ошибка (спасибо 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>

Симпатичный, да?

Тип параметра - string .

Я использую:

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

Обратите внимание, что ошибка не возникает при вызове веб-службы как объекта с страницы ColdFusion.




Ну, я думаю, что реализация Flex в SOAP Encoder, по-видимому, неверно сериализует нулевые значения. Сериализация их как String Null, похоже, не является хорошим решением. Формально правильная версия, похоже, должна передать пустое значение как:

<childtag2 xsi:nil="true" />

Таким образом, значение «Null» будет не чем иным, как действительной строкой, которая именно то, что вы ищете.

Я предполагаю, что это исправление в Apache Flex не должно быть так сложно сделать. Я бы рекомендовал открыть проблему Jira или связаться с ребятами из списка рассылки apache-flex. Однако это только исправит клиентскую сторону. Я не могу сказать, сможет ли ColdFusion работать с нулевыми значениями, закодированными таким образом.

См. Также сообщение блога Radu Cotescu. Как отправить нулевые значения в soapUI-запросы .




@ doc_180 имел правильную концепцию, за исключением того, что он фокусировался на числах, тогда как исходный плакат имел проблемы со строками.

Решение заключается в изменении файла mx.rpc.xml.XMLEncoder . Это строка 121

    if (content != null)
        result += content;

[Я посмотрел на Flex 4.5.1 SDK; номера строк могут отличаться в других версиях]

В принципе, проверка не выполняется, потому что «контент имеет значение NULL», и поэтому ваш аргумент не добавляется в исходящий пакет SOAP; что приводит к ошибке отсутствия параметра.

Вы должны расширить этот класс, чтобы удалить проверку. Затем происходит большой снежный ком по цепочке, изменяя SOAPEncoder, чтобы использовать измененный XMLEncoder, а затем изменяя операцию для использования вашего модифицированного SOAPEncoder, а затем moidfying WebService для использования вашего альтернативного класса Operation.

Я потратил несколько часов на это, но мне нужно двигаться дальше. Это, вероятно, займет день или два.

Вы можете просто исправить строку XMLEncoder и сделать некоторые исправления обезьян, чтобы использовать свой собственный класс.

Я также добавлю, что если вы переключитесь на использование RemoteObject / AMF с ColdFusion, нуль передается без проблем.

Обновление 16.11.2013 :

У меня есть еще одно последнее дополнение к моему последнему комментарию о RemoteObject / AMF. Если вы используете CF10; то свойства с нулевым значением для объекта удаляются из объекта на стороне сервера. Таким образом, перед доступом к нему необходимо проверить наличие свойств или получить ошибку времени выполнения. Проверьте следующее:

<cfif (structKeyExists(arguments.myObject,'propertyName')>
 <!--- no property code --->
<cfelse>
 <!--- handle property  normally --->
</cfif>

Это изменение поведения от CF9; где нулевые свойства превратятся в пустые строки.

Редактировать 12/6/2013

Поскольку возник вопрос о том, как здесь обрабатываются нули, это быстрое примерное приложение, демонстрирующее, как строка «null» будет относиться к зарезервированному слову null.

<?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>

Выход трассировки:

null string не равно нулевому зарезервированному слову, используя условие! =

null string не равна нулевому зарезервированному слову, используя условие ==

null string не равно нулевому зарезервированному слову, используя условие ===




Строка null значения в ActionScript даст строку "NULL" . Мое подозрение в том, что кто-то решил, что это хорошая идея, чтобы декодировать строку "NULL" как null , вызывая обрыв, который вы видите здесь, вероятно, потому, что они передавали null объекты и получали строки в базе данных, когда они не хотели этого (так что не забудьте также проверить эту ошибку).






Links