У нас есть сотрудник с фамилией 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
.
Я использую:
Обратите внимание, что ошибка не возникает при вызове веб-службы как объекта со страницы ColdFusion.
Ответы:
Отслеживание это вниз
Сначала я думал, что это была ошибка принуждения, к которой
null
насильно принуждали"null"
и тест"null" == null
проходил. Это не. Я был близок, но очень, очень не прав. Прости за это!С тех пор я много теребил на wonderfl.net и прослеживал код в
mx.rpc.xml.*
. В строке 1795XMLEncoder
(в источнике 3.5)setValue
, все кодирование XMLEndown сводится ккоторый по сути такой же как:
Этот код, согласно моей оригинальной скрипке, возвращает пустой элемент XML. Но почему?
причина
Согласно комментатору Джастину Маклину в отчете об ошибках FLEX-33664 , виновником является следующее (см. Последние два теста в моей скрипке, которые подтверждают это):
Когда
currentChild.appendChild
передается строка"null"
, она сначала преобразует ее в корневой элемент XML с текстомnull
, а затем проверяет этот элемент на соответствие нулевому литералу. Это тест на слабое равенство, поэтому либо XML, содержащий null, приводится к нулевому типу, либо нулевой тип приводится к корневому элементу xml, содержащему строку «null», и тест проходит там, где он, вероятно, должен потерпеть неудачу. Одним из исправлений может быть постоянное использование строгих тестов на равенство при проверке XML (или чего-то еще) на «нулевое значение».Решение
Единственный разумный обходной путь, о котором я могу подумать, если не считать исправления этой ошибки в каждой чертовой версии ActionScript, - это проверить поля на «null» и экранировать их как значения CDATA .Значения CDATA являются наиболее подходящим способом изменения всего текстового значения, которое в противном случае могло бы вызвать проблемы с кодированием / декодированием. Например, шестнадцатеричное кодирование предназначено для отдельных символов. Значения CDATA предпочтительны, когда вы экранируете весь текст элемента. Главная причина этого заключается в том, что он поддерживает удобочитаемость для человека.
источник
Что касается примечания к xkcd , на веб-сайте Bobby Tables есть хороший совет, позволяющий избежать неправильной интерпретации пользовательских данных (в данном случае, строки «Null») в запросах SQL на разных языках, включая ColdFusion .
Из вопроса не ясно, является ли это источником проблемы, и, учитывая решение, отмеченное в комментарии к первому ответу (встраивание параметров в структуру), кажется вероятным, что это было что-то другое.
источник
Проблема может быть в кодере SOAP Flex. Попробуйте расширить кодировщик SOAP в своем приложении Flex и отладить программу, чтобы увидеть, как обрабатывается нулевое значение.
Я думаю, это передается как NaN (не число). Это когда-нибудь испортит процесс демарширования сообщений SOAP (особенно на сервере JBoss 5 ...). Я помню, как расширил кодировщик SOAP и выполнил явную проверку того, как обрабатывается NaN.
источник
У @ doc_180 была правильная концепция, за исключением того, что он сосредоточен на числах, тогда как у оригинального плаката были проблемы со строками.
Решение состоит в том, чтобы изменить
mx.rpc.xml.XMLEncoder
файл. Это строка 121:(Я посмотрел на Flex 4.5.1 SDK; номера строк могут отличаться в других версиях.)
По сути, проверка завершается неудачно, потому что «content is null» и, следовательно, ваш аргумент не добавляется в исходящий пакет SOAP; таким образом вызывая ошибку отсутствующего параметра.
Вы должны расширить этот класс, чтобы удалить проверку. Затем идет большой снежный ком по цепочке, модифицируя SOAPEncoder для использования вашего модифицированного XMLEncoder, а затем модифицируя Operation для использования вашего модифицированного SOAPEncoder, а затем изменяя WebService для использования вашего альтернативного класса Operation.
Я потратил на это несколько часов, но мне нужно двигаться дальше. Это, вероятно, займет день или два.
Возможно, вам удастся просто исправить строку XMLEncoder и сделать некоторые исправления для использования вашего собственного класса.
Я также добавлю, что если вы переключитесь на использование RemoteObject / AMF с ColdFusion, нулевое значение будет передано без проблем.
16.11.2013 обновление :
У меня есть еще одно недавнее дополнение к моему последнему комментарию о RemoteObject / AMF. Если вы используете ColdFusion 10; затем свойства с нулевым значением объекта удаляются из объекта на стороне сервера. Таким образом, вы должны проверить существование свойств, прежде чем получить к ним доступ, иначе вы получите ошибку во время выполнения.
Проверьте вот так:
Это изменение в поведении по сравнению с ColdFusion 9; где нулевые свойства превратятся в пустые строки.
Изменить 6/12/2013
Поскольку возник вопрос о том, как обрабатываются значения NULL, здесь приведен быстрый пример приложения, демонстрирующий, как строка «NULL» будет относиться к зарезервированному слову NULL.
Результат трассировки:
источник
content
есть строка"null"
, и «null» == null возвращает false, так что тест ведет себя так, как задумано. Вместо этого я считаю, что проблема состоит в том, как XML.appendChild обрабатывает строковый аргумент, и как корневой XML-элемент, содержащий только строку «null», может быть приведен к литералуnull
.true
желаемое поведение здесь. Если произойдет обратное, это приведет к удалению строки «null» из процесса кодирования, что фактически станет причиной проблемы. Однако, поскольку этот тест завершается успешно, кодировщик продолжает работу, пока XML.appendChild не отбросит его из-за ошибки приведения.var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s);
в ваш пример кода.Переведите все символы в их шестнадцатеричные эквиваленты. В этом случае
Null
будет преобразован вE;KC;C;
источник
Строковое
null
значение в ActionScript даст строку"NULL"
. Я подозреваю, что кто-то решил, что поэтому будет хорошей идеей декодировать строку"NULL"
какnull
, вызывая разрыв, который вы видите здесь - возможно, потому что они передавалиnull
объекты и получали строки в базе данных, когда они не хотели это (так что не забудьте также проверить наличие такого рода ошибок).источник
В качестве хака вы могли бы рассмотреть возможность специальной обработки на стороне клиента, преобразования строки «Null» в нечто, что никогда не произойдет, например, XXNULLXX, и обратного преобразования на сервере.
Это не красиво, но это может решить проблему для такого граничного случая.
источник
Null
?Ну, я полагаю, что реализация SOAP-кодировщика Flex, по-видимому, неправильно сериализует нулевые значения. Сериализация их как String Null не кажется хорошим решением. Формально правильная версия, кажется, передает нулевое значение как:
Таким образом, значение «Null» будет не чем иным, как допустимой строкой, которая является именно тем, что вы ищете.
Я думаю, что исправить это в Apache Flex не так уж и сложно. Я бы порекомендовал открыть проблему Jira или связаться с парнями из списка рассылки apache-flex. Однако это только исправит клиентскую сторону. Я не могу сказать, сможет ли ColdFusion работать с нулевыми значениями, закодированными таким образом.
См. Также сообщение в блоге Раду Котеску. Как отправлять нулевые значения в запросах soapUI .
источник
null
правильно кодирует истинное значение, устанавливаяxsi:nil="true"
элемент. Проблема на самом деле заключается в том, как самXML
тип ActionScript (а не кодировщик) обрабатывает строку"null"
.Это ляп, но при условии , что есть минимальная длина
SEARCHSTRING
, например , 2 символа, параметр со вторым символом и передать его в качестве двух параметров , вместо этого: и их вместе при выполнении запроса к базе данных.substring
SEARCHSTRING
SEARCHSTRING1 ("Nu")
SEARCHSTRING2 ("ll").
Concatenate
источник
n
,u
,l
не имеют специальной семантики в XML. «NULL» и «<! [CDATA [NULL]]>» идентичны анализатору XML.NULL
, кроме педантичности,<blah>null</blah>
а<blah><![CDATA[null]]>
не парсера XML. Они должны давать одинаковые результаты, однако логический поток для их обработки отличается. Именно этот эффект мы используем в качестве обходного пути к ошибке в реализации flex XML. Я защищаю это по сравнению с другими подходами, так как это сохраняет читабельность текста и не имеет побочных эффектов для других анализаторов.